- super(超级的)“可以看做”是直接父类对象的引用。可以通过super来访问父类中被子类所覆盖的方法和属性。
- 使用super来调用普通方法,语句没有限制位置,可以在子类中随便使用。
- 在一个类中,若是构造方法的第一句没有调用super(...)或者this(...);那么Java默认都会调用super(),含义是调用父类的无参方法。
super关键字的使用:
public class TestSuper1 {
public static void main(String[] args) {
new ChildClass().f();
}
}
class FatherClass{
public int value;
public void f(){
value = 100;
System.out.println("FatherClass.value=" + value);
}
}
class ChildClass extends FatherClass{
public int value;
public int age;
public void f(){
super.f();//调用父类的普通方法
value = 200;
System.out.println("ChildClass.value=" + value);
System.out.println(value);
System.out.println(super.value);//调用父类的成员变量
}
public void f2(){
System.out.println(age);
}
}
继承树追溯:
属性/方法查找顺序:(比如查找变量h)
- 查找当前类中有没有属性h
- 依次上溯每个父类,查看每个父类中是否有h,直到Object
- 如果没有找到,则出现编译错误。
- 上面步骤,只要找到h变量,则这个过程中止。
构造方法调用顺序:
构造方法第一句总是:super(...)来调用父类对应的构造方法。所以流程就是:先向上追溯到Object,然后依次向下执行的初始化块和构造方法,直到前子类为止。
注:
静态初始化块调用顺序,与构造方法调用顺序一样,不在复用。