Java学习6 面向对象编程进阶

包(package)

为便于管理大型软件系统中数目众多的类,解决类的命名冲突问题。
package语句作为java源文件的第一条语句,指明该文件中定义的类所在的包。若缺省package语句,则指定为无名包。

package p1;

编译和生成包

生成class文件要加入`'-d'`参数值,若不适用`'-d'`参数,class文件不会按java文件的包路径生成对应文件夹。
javac -d destpth Test.java

import语句

使用定义在不同包中的java类

import p1.Test; //或 import p1.*;

Question:
import p1.*;会否有性能影响?
Answer:
不会,效果与import p1.Test;一样

注意: 一个类如果未声明为public的,则只能在其所在包中被引用,其他包中的类无法用import语句引入它。

JDK中主要的包介绍

包名 功能说明 包名含义
java.lang 包含了java语言程序设计的基础类 lang是language的简写
java.awt 包含了用于创建图形用户界面和绘制图形图像的相关类 awt是抽象窗口工具类(abstract window toolkit)的简写
java.util 包含集合、日期、国际化和各种实用工具类 util是utility的简写
java.io 包含可提供数据输入/输出相关功能的类 io是input/output的简写
java.net 提供用于实现java网络编程的相关功能类 net意为网络
java.sql 提供数据库操作相关功能类 sql是数据化查询语言(structed query language)的简写

继承(Inheritance)

Java只支持单继承,不允许多重继承。

访问控制

  • public的类可在任意场合被引用和使用,而非public的类只能在其所在包中被使用。

  • 类中成员的访问控制:

    修饰符 同一个类中 同一个包中 子类中 任意范围
    private Yes
    缺省 Yes Yes
    protected Yes Yes Yes
    public Yes Yes Yes Yes

方法重写、重载(Override)

  • 重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值类型;
  • 重写方法不能使用比被重写方法更严格的访问权限
  • 重写方法不允许声明抛出比被重写方法范围更大的异常类型

关键字super

在存在命名冲突(子类中存在方法重写或添加同名属性)的情况下,子类中的代码将自动使用子类中的同名属性或重写后的方法。也可以在子类中使用关键字super引用父类中的成分。

super.<属性名>
super.<方法名>(实参列表)

说明super的追溯不仅限于直接父类

多态性

虚方法调用(Virtual Method Invocation)

// 正常方法调用
Person e = new Person();
e.getInfo(); //调用Person的方法
Student e = new Student();
e.getInfo(); //调用Student的方法

//虚方法调用
Person e = new Student();
e.getInfo(); //运行时,调用的是子对象的方法

对象造型(Casting)

引用类型数据值之间的强制类型转换称为造型

  1. 从子类到父类的类型转换可以自动进行:

    Person p = new Student();
  2. 在多态的情况下,从父类到子类的类型转换必须通过造型(强制类型转换)实现:

    Person p1 = new Student();
    Student s1 = (Student)p1;//合法
    
    Person p2 = new Person();
    Student s2 = (Student)p2; //非法
  3. 无继承关系的引用类型间的转换是非法的:

    String s = "Hello, World!";
    Person p = (Person)s; //非法

instanceof运算符

用于检测一个对象的真正类型。注意:先判断子类,再判断父类。

class Person {
  //---
}
class Student extends Person {
  //---
}
class Graduate extends Student {
  //---
}

public class TestInstanceof {
  public void distribute(Person p) {
    if(p instanceof Graduate) {
        // 处理子类Graduate
    } else if (p instanceof Student) {
        // 处理子类Student
    } else {
        // 处理父类Person
    }
  }
}

协变返回类型

协变返回类型:重写方法时,修改其返回值的类型;但必须是重写前方法返回值类型的子类实现类类型。

class Person{
    // --
}
class Student extends Person{
    // --
}

class Parent {
    public Person getAssistor(){
        Person p = new Person();
        //--
        return p;
    }
}

public class CovarianReturn extends Parent {
    public Student getAssistor(){
        Student s = new Student();
        //--
        return s;
    }
}

方法重载(Overload)

一个类中存在多个同名方法,重载参数列表必须不同。

构造方法也可以重载。

可以在构造方法的第一行使用关键字this调用本类其他重载的构造方法(注意:若this不在第一行,将会编译报错,同样super也是第一行的,所以二者只能用其一):

class Person {
    private String name;

    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(String name) {
        this(name,18); //调用其他构造方法
    }

    public Person(int age) {
        this("Anonymous",age); //调用其他构造方法
    }
}

关键字static

  • static属性
  • static方法
    静态方法中只能调用静态属性和静态方法。
  • static初始化块
    static块仅在其所属的类被载入时执行一次,通常用于初始化static(类)属性。

    public class TestStatic {
        public static void main(String[] args) {
            System.out.println("Hello World!");
            System.out.println("total="+Person.total); //Person类被载入时,调用static初始化块
        }
    }
    
    class Person {
        public static int total;
        static {
            total = 100;
            System.out.println("in static block!");
        }
    }
    
    output:
    D:\xiaocancan\code\helloworld\2_TestStatic>java TestStatic
    Hello World!
    in static block!
    total=100
  • 非static初始化块
    非static的初始化块在创建对象时被自动调用。(可能被调用多次
public class TestStatic {
    public static void main(String[] args) {
        new A(); //调用非static初始化块
        new A(3); //再次调用非static初始化块
    }
}

class A {
    {
        System.out.println("in none static block!");
    }
    private int i=5;
    public A() {}
    public A(int a) {
        System.out.println("begin");
        i = a;
        System.out.println("end");
    }
}

output:
D:\xiaocancan\code\helloworld\2_TestStatic>java
in none static block!
in none static block!
begin
end

静态导入

静态导入用于在一个类中导入其他类或者接口中的static成员。

import static java.lang.Math.*;

public class TestStatic {
    public static void main(String[] args) {
        double d = sin(PI*0.45); //double d= Math.sin(Math.PI*0.45);
        System.out.println(d);
    }
}

Singleton设计模式

单例模式:只有一个对象实例,如打印机类对象

  • 构造方法private
  • 通过Static方法获取实例对象
public class Single{
    private Single(){}
    private static Single onlyone = new Single();
    public static Single getSingle(){
        return onlyone;
    }
}

关键字final

  • final标记的类不能被继承
  • final标记的方法不能被子类重写
  • final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次
  • final标记的成员变量必须在声明的同时或在每个构造方法中显式赋值,然后才能使用
  • final不允许用于修饰构造方法、抽象类以及抽象方法

你可能感兴趣的:(java)