继承
- 关键字:extends
- 优点:
- 提高代码的复用性
- 让类与类之间产生了关系,给多态提供了前提
- 父类是子类共性内容的抽取
- Java中只允许单继承,单继承:一个子类只允许有一个直接父类
- Java支持多重继承(例如:A继承B,B继承C,C继承D)
- 当要使用一个继承体系时:
- 查看该体系中的顶层类,了解该体系的基本功能
- 创建体系中的最子类对象,完成功能的使用
- 什么时候定义继承呢?
- 当类与类之间存在所属关系的时候定义,所属关系(xxx是yyy的一种,那么xxx继承yyy)
super关键字
- 子类成员与父类成员重名,可以使用super进行区分(调用父类的成员)(用法:super.成员名)
- this代表本类对象的引用
- super代表父类空间

- 方法的重写(子类中存在于父类一样的方法(函数名、返回值、参数列表,都需要一样,方法体可以不一样))
- 重写:子类方法的权限必须要大于父类的权限,
- 静态只能重写静态,或者被静态重写
子类继承父类后的实例化过程
class Fu{
Fu(){
System.out.println("Fu create");
}
}
class Zi extends Fu{
Zi(){
//super();默认隐式存在一个父类的无参构造函数 且必须在第一行
//这里也可以是有参构造super(2);,但是父类需要显示的定义对应的有参构造
System.out.println("Zi create");
}
}
public class Demo01 {
public static void main(String[] args) {
new Zi();//子类在进行实例化的时候:子类中所有的构造函数默认都会访问父类中的空参数的构造函数
}
}
- 为什么子类实例化的时候需要访问父类的构造函数?
- 父类可能会在构造函数中对自己的一些属性进行初始化操作,所以子类需要先看看父类的属性内容,然后再进行继承使用,所以需要调用父类的构造函数
- 为了完成上述目的,所以就在子类的构造函数的第一行加入了super();
- 如果父类中没有定义无参构造,那么子类需要明确的执行子类需要使用父类的哪个构造函数
- 如果子类的构造函数中使用了this();调用自己的构造函数,那么super();在此构造函数中就没有了,因为super();和this();都只能定义在第一行,this();调用的其他构造函数肯定会访问父类的构造函数。这是机制
- Java中的所有类都默认是Object的直接子类或者间接子类,一个没有显示的继承任何类的类,他默认继承了Object
class A extends Objectextends只是没有显示。
子类实例化成员变量加载过程
package com.bixiangdong.oop;
class Fu1{
Fu1(){
super();
show();//这里的show是this.show(); this省略了
}
void show(){
System.out.println("Fu1 Run");
}
}
class Zi1 extends Fu1{
int num=8;
Zi1(){
super();
//super初始化父类内容时,子类成员变量并未进行初始化,super父类初始化完毕之后
//才进行子类成员变量的初始化
System.out.println("Zi1 Run"+num);
show();
}
void show(){
System.out.println("Zi1 Run---"+num);
}
}
public class Demo02 {
public static void main(String[] args) {
Zi1 zi1 = new Zi1();
zi1.show();
}
}
//结果
Zi1 Run---0
Zi1 Run8
Zi1 Run---8
Zi1 Run---8
- 从上述结果可以看出,Fu1中的构造方法运行的show是子类的show,其中的num为0,所以可以看出子类的成员变量还没有进行初始化,而且其中的show方法默认省略了this.show(); this代表当前对象 而当前对象是Zi1 所以使用的是子类的show方法
- 父类初始化完毕之后才进行的子类初始化