10、java关键字之super关键字

1 super含义

  1. super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。(位置没有限制)
  2. 所有构造方法的第一行代码没有显式的调用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());属性、方法的查询是先从子类开始

猜你喜欢

转载自www.cnblogs.com/lanmao123/p/10489652.html