java只有单继承,不能多继承
- 子类只能继承父类的非私有成员(成员变量、成员方法)
- 子类不能继承父类的构造方法,但是可以通过super关键字访问父类的构造方法
- 继承 要体现子类父类的 继承关系, ”is a“
当子类和父类有同名函数或变量,采用就近原则,子类有就不用父类的
java 构造器的 构造方法调用顺序:
构造方法的第一句总是: super(...) 来调用父类对应的构造方法。 所以流程上就是:先向上追溯到 Object 类,然后再一次向下执行类的初始化块和构造方法。直到当前子类。
this/super
采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突
this:代表当前对象的引用,谁来调用我,我就代表谁
super:代表当前对象父类的引用
父类没有无参构造方法,子类的构造函数中
super()
this()
注意:super(...) 或者 this(...) 必须出现在构造方法的第一条语句上
子类中所有的构造方法默认都会访问父类的无参构造方法
因为子类会继承父类中的数据,可能还会使用父类的数据,所以要先完成父类数据的初始化
1 class Test2_Extends {
2 public static void main(String[] args) {
3 Zi z = new Zi();
4 }
5 /*
6 1,jvm调用了main方法,main进栈
7 2,遇到Zi z = new Zi();会先将Fu.class和Zi.class分别加载进内存,再创建对象,当Fu.class加载进内存
8 父类的静态代码块会随着Fu.class一起加载,当Zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载
9 第一个输出,静态代码块Fu,第二个输出静态代码块Zi
10 3,走Zi类的构造方法,因为java中是分层初始化的,先初始化父类,再初始化子类,所以先走的父类构造,但是在执行
11 父类构造时,发现父类有构造代码块,构造代码块是优先于构造方法执行的所以
12 第三个输出构造代码块Fu,第四个输出构造方法Fu
13 4,Fu类初始化结束,子类初始化,第五个输出的是构造代码块Zi,构造方法Zi
14 */
15 }
16 class Fu {
17 static {
18 System.out.println("静态代码块Fu");
19 }
20
21 {
22 System.out.println("构造代码块Fu");
23 }
24
25 public Fu() {
26 System.out.println("构造方法Fu");
27 }
28 }
29
30 class Zi extends Fu {
31 static {
32 System.out.println("静态代码块Zi");
33 }
34
35 {
36 System.out.println("构造代码块Zi");
37 }
38
39 public Zi() {
40 System.out.println("构造方法Zi");
41 }
42 }
最后的输出如下: