五、面向对象特征 二:继承性(inheritance)
一、继承性的优势:
1、减少代码冗余,提高代码的复用型
2、便于功能的拓展
3、为之后的多态性的使用提高了前提
二、继承性的格式: class A extends B {}
A:子类、派生类、subclass
B: 父类、超类、基类、superclass
2.1体现:一旦 A继承父类 B 之后,子类 A 中就获取了父类 B 中声明的所有的结构:属性、方法
特别的,父类中声明为 private 的属性或方法,子类继承父类之后,仍然认为获取了父类中私有的机构
2.2 子类继承父类之后,还可以声明自己特有的属性或方法:实现功能的拓展
子类和父类的关系,不同于子集和集合的关系,即:子类反而可能比父类更丰富
extends:延展、拓展
三、Java 中关于继承性的规定
1、一个类中可以被多个子类继承
2、Java 中类的单继承性,:一个类只能有一个父类
3、子父类是相对的概念,
4、子类直接继承的父类,称为:直接父类; 间接继承的父类称为:间接父类
5、子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性和方法
下图为例子来帮助理解一些:
其中 Person 为 Graduate 的间接父类
Soldier、Student、Officer 的直接父类都是 Person
四 1、如果我们没有显式的声明一个类的父类话,则此类继承于 java.lang.Object 类
2、所有的 java 类(除 java.lang.Object 类之外)都直接或间接的继承于 java.lang.Object 类
3、意味着,所有的 java 类都具有 java.lang.Object类声明的功能
5-2 方法的重写(Override/overwrite)
定义:在子类中,可以**根据需要对从父类中继承来的方法进行改造**,也称为方法的重置、覆盖
mac 电脑上面方法重写快捷键为: control+O
应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中同名同参数的方法时,实际执行的是子类重写父类的方法
重写的方法 是同名 同参数列表
区分方法的重载与重写
重写(Override): 是子类对父类允许方位的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写。
重载(Overload):是在一个类里面,方法名字相同,二参数不同。返回类型可以相同也可以不同,每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
5.3 四种权限修饰符
符 | 类内部 | 同一个包 | 不同包的子类 | 同一个工程 |
---|---|---|---|---|
private | YES | |||
(缺省) | YES | YES | ||
protected | YES | YES | YES | |
public | YES | YES | YES | YES |
对于 class 的权限修饰符 只可以用 public 和 default (缺省)
public 类可以在任意地方被访问
default 类只可以被同一个包内部的类访问
5.4 关键字: super
super 关键字的使用:
1、super 理解为: 父类的…
2、super 可以用来调用:属性、方法、构造器
3、super的使用
3.1 我么你可以在子类的方法或构造器中,通过使用“super.属性” 或“super.方法”的方式,显式的调用父类的属性或方法;但是通常情况下,我们都省略不写
3.2特殊情况:当子类和父类中定义了同名的属性时,我们要想调用父类中的属性,则必须使用 super.属性来显式调用父类中声明的属性
3.3 特殊情况: 当子类重写了父类的方法,我们想在子类的方法中调用父类被重写的方法,则必须使用 super.方法 来调用
4、super调用构造器
4.1 我们可以在子类的构造器中 显式的使用“super(形参列表)”的方式,调用父类中声明的指定的构造器
4.2“super(形参列表)”的使用,必须声明在子类构造器的首行
4.3 我们在类的构造器中,针对"this(形参列表)"或“super(形参列表)”只能二选一
4.4 在构造器的首行,没有显式的声明“this(形参列表)”“super(形参列表)”时,会有默认的父类空参的构造器 super()构造器
4.5 在类的多个构造器中,至少有一个类的构造器中使用了“super(形参列表)”,调用父类中的构造器
5.5 子类对象的实例化
子类对象实例化的全过程
1.从结果上看:(继承性)
子类继承父类以后,就获取了父类中声明的属性和方法
创建子类的对象,在堆空间中,就会加载所有父类中声明的属性
2.从过程上来看:
当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器…直到调用了 java.lang.object 类中的空参的构造器。正因为加载过所有的父类的结构,所以才可以看到内存中有父类中的结构,子类对象才可以考虑进行调用
明确:虽然创建子类对象时,调用了父类的构造器,但是自始至终就创建过一个对象,即为 new 的子类对象
5.6 面向对象特征之三: 多态性
1、理解多态性:可以理解为一个事物的多种形态
2、多态性是啥?
即对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法—虚拟方法调用
3、多态的使用:虚拟方法调用
有了对象的多态性后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法
总结
总结:编译看左边,运行看右边
4、多态的使用前提:a.类的继承关系 b.方法的重写
5、对象的多态性只适用于方法,不适应于属性(编译和运行都看左边)
多态性是运行时行为