文章目录
第5章 继承
5.1 类、超类和子类
extend: Java只有公共继承,不支持多重继承
// 调用超类方法, 基类不能直接访问超类私有字段
super.getSalary();
// 调用超类构造器, 放在基类构造器第一行,若没有显式调用则自动调用超类无参构造器
super(param1, param2, ...);
多态:一个对象变量可以指示多种实际类型的现象,在运行时动态绑定恰当的方法。(子类对象可赋值给超类变量)
静态绑定:private方法、static方法或final方法
方法表:列出所有方法的签名和要调用的实际方法
// Manager 继承与 Employee
Employee e = new Manager(...);
e.getSalary(); // 可以
e.setBonus(100); // 不可以,setBonus是Manager的方法
- fianl类:不允许扩展的类(方法自动成为final);
- final方法:不允许覆盖的方法。
// 强制类型转换
if (a instanceof Class) // 判断a是不是Class的类别或子类
{
c = (Class) a;
}
static: 抽象类(不能实例化,可以定义抽象类的对象变量引用非抽象子类的对象)、抽象方法
修饰符 | 范围 |
---|---|
private | 仅本类可见 |
public | 对外部完全可见 |
protected | 对本包和子类可见 |
无修饰符 | 对本包可见 |
5.2 Object:所有类的超类
// Object类型的变量可以引用任何类型对象
Object obj = new Employee(...);
// obj只作为泛型容器,要进行具体操作需强制类型转换
Employee e = (Employee) obj;
obj = new Employee[10];
obj = new int[10];
注:Java只有基本类型不是对象!所有数组(对象、基本类型)都扩展了Object类!
==:判断内存地址是否相等(引用类型)、判断值是否相等(数值类型)
equals:只用于引用类型,Object默认是判断内存地址是否相等,子类可重写
(子类重写equals,应先调用父类equals)
Object.equals(obj1, obj2); Arrays.equals(arr1, arr2);
hashCode();
5.3 泛型数组列表
// ArrayList<Class> 有参数类型的泛型类 class不能是基本类型
ArrayList<Employee> staff = new ArrayList<Employee>();
ArrayList<Employee> staff = new ArrayList<>(); // 菱形语法
var staff = new ArrayList<Employee>();
staff.add(new Employee(...)); // 数组空间满了会自动创建更大的数组
staff.add(index, new Employee(...)); // 指定位置插入
staff.ensureCapacity(100); // 分配包含100个对象的内部数组,超过100重新分配空间
ArrayList<Employee> staff = new ArrayList<>(100);
staff.size(); // 等价于数组 arr.length
staff.trimToSize(); // 数组容量削减到当前大小
staff.get(i);
staff.set(i, harry); // 替换已存在的元素;等价于数组的 a[i] = harry;
// 转化为数组
staff.toArray(arr); // arr = new Employee[staff.size()];
staff.remove(index);
5.4 对象包装器与自动装箱
包装器类:Integer、Long、Float、Double、Short、Byte、Character、Boolean(不可变, final 不能派生子类)
注:比较两个包装器对象用equals!
编译器执行装箱与拆箱:
- 自动装箱:
list.add(3); // list.add(Integer.valueOf(3));
- 自动拆箱:
int n = list.get(i); // int n = list.get(i).intValue();
5.5 参数数量可变的方法
public static double max(double... values)
{
...
}
double m = max(1.0, 3.1, 4); // 基本类型值将自动封箱为对象 new double[]{1.0, 3,1, 4}
5.6 枚举类
public enum Size{SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL")};
Size是一个类,有4个实例,不能构造新的对象,因此比较枚举类型的值不需要用 equals,直接用 == 。
枚举类型(Enum子类)可以增加构造器(私有)、方法和字段。
5.7 反射
反射:能够分析类能力的程序。
pass
5.8 继承的设计技巧
- 将公共操作和字段放在超类中;
- 不要使用受保护的字段;
- 使用继承实现 “is-a” 关系;
- 除非所有继承的方法都有意义,否则不要使用继承;
- 在覆盖方法时,不要改变预期的行为;
- 使用多态,而不要使用类型信息;
- 不要滥用反射。