这样吧,先上一段代码:
package com.zjb;
public class Father {
private String testStr = "father field";
public Father() {
System.out.println("进入Father的构造方法,此时Father中的testStr=" + testStr);
testMethod();
}
public void testMethod() {
System.out.println("进入Father的testMethod方法,此时Father中的testStr=" + testStr);
}
}
package com.zjb;
public class Son extends Father {
private String testStr = "son field";
public Son() {
System.out.println("进入Son的构造方法,此时Son中的testStr=" + testStr);
}
public void testMethod() {
System.out.println("进入Son的testMethod方法,此时Son中的testStr=" + testStr);
}
public static void main(String[] args) {
new Son();
}
}
然后就不卖关子了,直接记录吧。
进入Father的构造方法,此时Father中的testStr=father field
进入Son的testMethod方法,此时Son中的testStr=null
进入Son的构造方法,此时Son中的testStr=son field
首先,注意下输出的顺序,其次,注意下第二句。new Son()执行时,先进入Father的构造方法,根据第一句输出可知,执行构造方法前,成员变量已然初始化。所以此时Father中的testStr为“father field”。在Father的构造方法中,调用tsetMethod方法,此时调用的是子类的testMethod,由于此时Son中的testStr还没有初始化,所以会输出第二句testStr=null。第三句道理同第一句。
由上可得出结论:
1、成员变量初始化先于构造方法调用(此处加一句:静态代码块 > 静态变量 > 成员变量 > 构造方法,不知客官懂否)
2、多态中向上转型(Father father = new Son()这种),father引用若调用同名方法,则调用的是子类里面的方法。