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 }
最后的输出如下: