子类继承父类,重写了父类方法,那么调用时就会调用子类重写后的方法
- 例子
public class TestParent {
protected static String name = "parent";
TestParent(){
say();
}
public void say(){
System.out.println("Hello"+name);
}
}
public class TestChild extends TestParent{
private String name = "child";
TestChild(){
say();
}
public void say(){
//super.say();
System.out.println("Hello"+name);
}
public static void main(String[] args){
TestParent a = new TestChild();
}
}
可能你会认为答案是这样的
Helloparent
Hellochild
但这是错的,在执行父类的构造方法时,调用的并不是父类的say方法,而是子类重写的say方法,此时子类非静态变量并未加载,所以输出为null。要想指定调用父类方法可用super.say()来指定,若想执行父类构造器时输出name,可将子类变量设置为static/final,那么就会先于构造器执行。
- 正确答案
Hellonull
Hellochild
- PS:父类子类加载顺序
父类静态变量
父类静态代码快
子类静态变量
子类静态代码快
父类非静态变量
父类非静态代码快
父类构造函数
子类非静态变量
子类非静态代码快
子类构造函数
静态资源放在方法区,线程共享,只会加载一次