本文已参与「新人创作礼」活动,一起开启掘金创作之路。
7. 类的继承
Object类是所有类的直接或者间接的超类。,也即每个类都直接或者间接地继承了Object类。
7.1. 类继承的概念
- 根据已有类来定义新类,新类拥有已有类的所有功能
- Java只支持类的单继承,每个子类只能有一个直接超类
- 超类是所有子类的公共属性及方法的集合,子类则是超类的特殊化 子类对象从外部来看,应该包括:
- 与超类相同的接口
- 可以具有更多的方法和数据成员 继承的关键字为extends
子类不能直接访问从超类中继承的私有属性及方法,但可使用公有(及保护)方法进行访问。 子类不能继承父类中的静态属性
7.2 隐藏和覆盖
属性的隐藏:
- 子类中声明了与超类中相同的成员变量
- 从超类继承的变量将被隐藏
- 子类拥有了两个相同名字的变量,一个继承自超类,另一个由自己声明
- 当子类执行继承自超类的操作时,处理的是继承自超类的变量,而当子类执行它自己声明的方法时,所操作的就是它自己声明的变量
- 隐藏属性时可以修改变量类型
访问被隐藏的超类属性
- 调用从超类集成的方法,则操作的是从超类继承的属性
- 本类中声明的方法使用“super.属性”访问从超类继承的属性 方法覆盖:
- 如果子类不需要使用从超类继承来的方法的功能,则可以声明自己的同名方法,成为方法覆盖
- 覆盖方法的返回类型、方法名称,参数个数及类型必须和被覆盖的方法一模一样
- 只需在方法名前面使用不同的类名或不同类的对象名即可区分覆盖方法和被覆盖方法
- 覆盖方法的访问权限可以比被覆盖的宽松,但是不能更为严格 方法覆盖的应用场合:
- 子类中实现与超类相同的功能,但采用不同的实现细节;
- 在名字相同的方法中,要增加功能
- 在子类中需要取消从父类继承的方法; 方法覆盖的注意事项:
- 必须覆盖的方法
- 子类必须覆盖父类中的抽象方法,否则子类自身也成为抽象类(不能实例化)
- 不能覆盖的方法
- 父类中声明为final的终结方法
- 父类中声明为static的静态方法
- 调用被覆盖的方法
-
super.xxx()
-
7.3. Object类
相等和同一
- 两个对象具有相同的类型,及相同的属性值,则称二者相等(equal)
- 如果两个引用变量指向的是同一个对象免责成这个两个引用变量同一(identical)
- 两个对象同一,则肯定相等
- 两个对象相等,不一定同一
- 比较运算符“==”判断的是这两个对象是否同一(比较的是两个引用是否相等,所以等价于对象是否同一) equals()方法判断的是两个对象的引用是否相等,也即两个对象是否同一 finalize方法:在对象被垃圾回收器回收之前,系统自动调用对象的finalize方法
7.4 终结类与终结方法
- 用final修饰的类和方法
- 终结类不能被继承
- 终结方法不能被子类覆盖
7.5 抽象类(abstract)
抽象类
- 类名前加修饰符abstract:abstract class Number{...}
- 可包含常规类能包含的任何成员,包括非抽象方法
- 也可包含抽象方法:用abstract修饰,只有方法原型,没有方法实现
- 抽象类没有具体实例对象,也即不能使用new方法进行实例化,只能用作超类
- 只有当子类实现了抽象超类中的所有抽象方法,子类才不是抽象类,可以通过new产生实例
如果一个抽象类除了抽象方法外什么都没有,则使用接口更合适。
8 接口与多态
8.1 接口
接口就是一个纯的抽象类,只有类的设计,没有类的实现 接口:
- 接口中可以规定方法的原型:方法名、参数列表和返回类型,但不规定方法主体
- 也可以包含基本数据类型的数据成员,但它们都默认为static和final
实现接口
- 使用implements关键字
- 必须实现接口中的所有方法
- 来自接口的方法必须声明成public
接口与接口之间可以继承,一个接口可以继承自多个接口,但是类不能继承自多个类 一个类可以实现多个接口,通过这种机制可实现对设计的多重继承