子类继承父类,重写了父类方法,那么调用时就会调用子类重写后的方法
例子 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:父类子类加载顺序 父类静态变量 父类静态代码快 子类静态变量 子类静态代码快 父类非静态变量 父类非静态代码快 父类构造函数 子类非静态变量 子类非静态代码快 子类构造函数 静态资源放在方法区,线程共享,只会加载一次