一、类、超类和子类
1、子类与父类
- 使用关键字extends来表示继承
- 应该将更一般的方法放在父类中,而将更特殊的方法放在子类中
2、子类构造器
- 使用super调用构造器的语句必须是子类构造器的第一条语句
- 如果子类的构造器没有显式地调用超类的构造器,将自动地调用超类的无参数构造器
- super关键字有两个含义,一是调用超类的方法,二是调用超类的构造器
- 一个对象变量可以指示多种实际类型的现象称为多态,在运行时能够自动地选择适当的方法,称为动态绑定
3、多态
- 可以用is-a“关系来判断继承关系,它指出子类的每个对象也是超类的对象
- "is-a"原则的另外一种表述——替换原则:它指出程序中出现超类对象的任何地方都可以使用子类对象替换
- 子类的引用可以赋值给超类变量,反之则不行
- 在覆盖一个方法时,子类方法不能低于父类方法的可见性,如果父类是public的,则子类也必须为public
4、抽象类
- 用abstract关键字来修饰抽象类
- 包含一个或多个抽象方法的类本身必须被声明为抽象的
- 除了抽象方法外,抽象类还可以包含字段和具体方法
- 抽象方法充当着占位方法的角色,它们在子类中具体实现
- 扩展抽象类有两种选择:
1)在子类中保留抽象类中的部分或所有抽象方法仍未定义,这样就必须将子类也标记为抽象类
2)子类定义抽象类的全部方法,这样子类就不再是抽象的了
- 即使不含抽象方法,也可以将类声明为抽象类
- 抽象类不能实例化,但可以创建一个具体子类的对象
- 可以定义一个抽象类的对象变量,但是这样一个变量只能引用非抽象子类的对象
5、受保护访问
- 子类也不能访问超类的私有字段
- JAVA中四个访问控制修饰符:
1)仅对本类可见——private
2)对外部完全可见——public
3)对本包和所有子类可见
4)对本包可见——默认,不需要修饰符
6、相等测试
没看懂……
7、泛型数组列表
-
声明和构造一个保存Employee对象的数组列表:
ArrayList staff = new ArrayList();
在JAVA10中,可以使用var关键字以避免重复写类名
var staff = new ArrayList<Employee>();
如果不使用var关键字,可以省略右边的参数类型
ArrayList<Employee> staff = new ArrayList<>(); //菱形语法
- 访问数组列表元素
不能使用[ ]来访问数组列表元素,应使用get和set方法
staff.set(i,Harry);
8、自动装箱与自动拆箱
- 所有的基本类型都有一个与之对应的类,如,int对应Integer,这些类称为包装器(wrapper)
- JAVA在某些时候会自动地识别并把基本类型转换为其所对应的类的对象,或把基本类型对应类的对象转换回基本类型,这叫做自动装箱(autoboxing)或自动拆箱
- 装箱与拆箱是编译器要做的工作,不是虚拟机,编译器在生成类的字节码时会插入必要的方法调用