程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 繼承-這段代碼的輸出結果能不能給解釋解釋?

繼承-這段代碼的輸出結果能不能給解釋解釋?

編輯:編程綜合問答
這段代碼的輸出結果能不能給解釋解釋?

public class A {
public A() {init();}
protected void init() {}
static class B extends A{
int i,j=999;
protected void init() {
System.out.println("此時A的構造方法正在調用此方法:i的值為:"+i+",j的值為:"+j);
i=888;
j=111;
}
}
public static void main(String[] args) {
B b = new B();
System.out.println("最終i的值為:"+b.i+",j的值為:"+b.j);
}
}

最佳回答:


輸出結果:此時A的構造方法正在調用此方法:i的值為:0,j的值為:0
最終i的值為:888,j的值為:999

樓主這道題剛開始看確實有點詭異。所以我只能根據結果來推斷。
首先在執行B b = new B();的時候,會調用B的構造函數,而B是繼承A的,相當於在B的構造函數中有super();這一句,所以會執行A的構造函數。而A的構造函數又調用了init方法。可這裡A的init方法已經被B給重寫了,而且這裡是生成的B的實例,所以會執行B的init方法。執行完後i=888,j=111.這時構造方法執行完畢,開始執行賦值操作,而成員變量i並沒有賦值操作,i還是等於888,而j已經做了賦值操作,所以j被賦值為999.你可以給i一個賦值測試一下,發現i的值會是你賦的值。至於為什麼先執行構造函數再執行賦值操作,你可以谷歌搜索JVM類加載子系統的執行過程。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved