1 super含义
- super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。(位置没有限制)
- 所有构造方法的第一行代码没有显式的调用super(...)或者this(...);那么Java默认都会调用super(),含义是调用父类的无参数构造方法。这里的super()可以省略。
每个方法里面都有两个隐式参数:this和supe.This关键字指向本类super关键字指向直接父类
super测试代码
package renjinbao_super; public class Test { public static void main(String[] args) { new ChildClass().f(); } } class GrandFatherClass { public int value; public void f() { value = 50; System.out.println("GrandFatherClass.value=" + value); } } class FatherClass { public int value; public void f() { value = 100; System.out.println("FatherClass.value=" + value); } } class ChildClass extends FatherClass { public int value; public void f() { super.f(); value = 200; System.out.println("ChildClass.value=" + value); System.out.println(value); System.out.println(super.value); } } 运行结果: FatherClass.value=100 ChildClass.value=200 200 100
2 继承树追溯
注:静态初始化块调用顺序,与构造方法调用顺序一样,不再重复。
构造方法向上追溯执行测试
package TestThis; public class TestSuper { public static void main(String[] args) { System.out.println("开始创建一个ChildClass对象......"); new ChildClass(); } } class FatherClass { public FatherClass() { System.out.println("创建FatherClass"); } } class ChildClass extends FatherClass { public ChildClass() { System.out.println("创建ChildClass"); } } 运行结果: 开始创建一个ChildClass对象...... 创建FatherClass 创建ChildClass
3 内存分析图
结论
静态初始化块和类都先初始父类(因为构造器第一句都是super());属性、方法的查询是先从子类开始