父類
class Base{
int x=10;
public Base(){
this.printMessage();
System.out.println("父類的構造方法"+x);
x=20;
}
public void printMessage(){
System.out.println("父類的構造方法中的方法Base.x="+x);
}
}
子類
class Sub extends Base{
int x=30;
public Sub(){
this.printMessage();
System.out.println("子類的構造方法"+x);
x=40;
}
public void printMessage(){
System.out.println("子類的構造方法中的方法sub.x="+x);
}
}
主程序
public class helloWorld {
public static void main(String[] args) {
Base b=new Sub();
// Base c=b;
b.printMessage();
System.out.println(b.x);
}
}
結果爲:
子類的構造方法中的方法sub.x=0
父類的構造方法10
子類的構造方法中的方法sub.x=30
子類的構造方法30
子類的構造方法中的方法sub.x=40
20
首先1.new Sub()時,先實現父類的構造方法,(這裏子類在繼承父類時,重寫了父類方法)所以執行父類構造方法中的打印方法時被替換成了重寫後的方法。
2 .然後父類中的this指的是子類這個對象,還未對x進行賦值,所以打印出來默認爲0。
3.然後執行子類Sub,先賦值,再執行構造方法,打印出爲30.
4.關鍵的一步來了,實例化後的對象並沒有給子類Sub而是給了父類Base,也就是說實例化的子類又賦給了父類,所以要執行父類的構造方法,x被賦值爲20.