第5章 继承

2023-02-17 16:07:37

第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 继承的设计技巧

  1. 将公共操作和字段放在超类中;
  2. 不要使用受保护的字段;
  3. 使用继承实现 “is-a” 关系;
  4. 除非所有继承的方法都有意义,否则不要使用继承;
  5. 在覆盖方法时,不要改变预期的行为;
  6. 使用多态,而不要使用类型信息;
  7. 不要滥用反射。
  • 作者:zengxy1111
  • 原文链接:https://blog.csdn.net/zengxy1111/article/details/126818854
    更新时间:2023-02-17 16:07:37