第5章 继承
2019-06-06 本文已影响0人
KaveeDJ
5.1 类、超类、子类
5.1.1 定义子类
5.1.2 覆盖方法
- 子类不能直接访问父类的私有域,必须借助于get方法
5.1.3 子类构造器
- 使用super调用构造器的语句必须是子类构造器的第一条语句
5.1.4 继承层次
5.1.5 多态
- 父类不能调用子类特有的方法
5.1.6 理解方法调用
5.1.7 阻止继承:final类和方法
5.1.8 强制类型转换
- 在将超类转换成子类之前,应该使用instanceof进行检查
5.1.9 抽象类
- 抽象方法,是一个重要的概念
- 有抽象方法的类,称为抽象类
- 抽象方法,即不提供实现,由子类实现的方法
- 类即使不含抽象方法,也可以将类声明为抽象类,抽象类不能被实例化。
5.1.10 受保护访问
- 不要使用protected域
- 可以使用protected方法
- protected方法的范例,clone方法
- protected对子类和本包可见
5.2 Object:所有类的超类
- 由于在Java中,每个类都是由Object类扩展而来的,所以,熟悉这个类提供的所有服务十分重要。
5.2.1 equals方法
- 默认比较对象地址值
- 我们实际上需要重写equals方法,比较对象的内容,一般都会重写equals方法
- Objects.equals方法可以防备两个对象同时为空,底层再调用equals
5.2.2 相等测试与继承
- Java语言规范要求equals方法具有下面的特性
1 自反性
2 对称性
3 传递性
4 一致性
5 非空性 - 使用==比较基本类型域,使用equals比较对象域
5.2.3 hashCode方法
- Object类中默认的散列码为对象的存储地址
- 两个相等的对象,返回相等的散列码
- 经常与equals方法一起使用
5.2.4 toString方法
- 它用于返回表示对象值的字符串
- println直接调用toString方法
- Object类默认的toString方法是类名加哈希码
5.3 泛型数组列表
- 在Java的老版本中,程序员使用Vector类实现动态数组。不过,ArrayList类更加有效,没有任何理由一定要使用Vector类
5.3.1 访问数组列表元素
- ArrayList底层由数组实现,有自动扩容的功能
5.3.2 类型化与原始数组列表的兼容性
5.4 对象包装器与自动装箱
- 自动装箱规范要求-128~127之间的基本类型被包装到固定对象中,可以共享
5.5 参数数量可变的方法
- 可变参数就是数组,可变参数必须是最后一个参数
5.6 枚举类
5.7 反射
- 能够分析类能力的程序称为反射(reflective)
- 主要使用人员是工具构造者,而不是应用程序员
5.7.1 Class类
- Class类记录类运行时的信息
5.7.2 捕获异常
- 编译时异常,运行时异常
5.7.3 利用反射分析类的能力
5.7.4 在运行时使用反射分析对象
5.7.5 使用反射编写泛型数组代码
5.7.6 调用任意方法
5.8 继承的设计技巧
- 不要用protected域,因为这破坏了封装性,子类可以访问父类的域
- 同一个包中,也可以访问protected域
- protected方法可以用,让子类重写
- 除非所有继承的方法都有意义,否则不要使用继承