2011-10-15 100 views
0

傢伙能否請您給我解釋一下怎麼來的這個例子的輸出是:解釋這個繼承Java程序的輸出?

Exam1 
    This is Tennis Shoes 
    derived class 
    This is a white Tennis Shoes is created 

如果你能到我,我們創造了White Tennis Shoes對象發生了什麼之後到底發生了什麼解釋。 請大家不要告訴我做你的功課,或者我只是準備考試,而這是一個老問題。

的代碼如下:

class Shoes{ 
    public Shoes(){ 
     this("you have created a shoes Object"); 
     System.out.println("This is the base class"); 
    } 

    public Shoes(String s){ 
     System.out.println(s); 
    } 
} 

class TennisShoes extends Shoes{ 
    public TennisShoes(){ 
     this("This is Tennis Shoes"); 
     System.out.println("derived class"); 
    } 

    public TennisShoes(String s){ 
     super("Exam1"); 
     System.out.println(s); 
    } 
} 

class WhiteTennisShoes extends TennisShoes{ 
    public WhiteTennisShoes(String s){ 
     System.out.println(s); 
    } 
} 

class ConstructorPrintingTester{ 
    public static void main(String[] args){ 
     WhiteTennisShoes shoesObj; 
     shoesObj = new WhiteTennisShoes("This is a white Tennis Shoes is created"); 
    } 
} 
+3

無論作業與否,爲什麼不先解釋發生了什麼? –

+0

我不知道當你調用this(「xxxx」)時,它會調用當前構造函數中的另一個構造函數,這就是爲什麼它在思考15分鐘後阻止了我!感謝phihag現在非常清楚,我喜歡他列舉他們的方式,這是非常有用的。 –

+0

我也完全忘記了當你調用super()構造函數時,Java將爲我創建一個。所以這就是爲什麼我真的無法從輸出中理解一件事。 –

回答

3

當您創建WhiteTennisShoes類型的對象,它的構造函數執行:

public WhiteTennisShoes(String s){ 
    super(); // This line is automatically inserted 
    System.out.println(s); 
} 

由於每個構造函數必須調用超或在第一線的另一個構造函數,這樣使得Java自動調用paremeter-不是超級構造函數,那麼調用具有arity 0的TennisShoes構造函數。當前的調用堆棧然後

main(..) 
WhiteTennisShoes("This is a white ...") 
TenniesShoes() 

現在,TenniesShoes()不會調用在第一線的另一個構造函數。當前調用堆棧現在

main(..) 
WhiteTennisShoes("This is a white ...") 
TenniesShoes() 
TenniesShoes("This is Tennis Shoes") 

即構造函數調用的說法"Exam1"單參數的構造函數超。調用堆棧是

main(..) 
WhiteTennisShoes("This is a white ...") 
TenniesShoes() 
TenniesShoes("This is Tennis Shoes") 
Shoes("Exam1") 

由於Shoes的一個參數的構造函數不調用構造函數,超類對象是現在所謂的隱性之一;調用堆棧是

main(..) 
WhiteTennisShoes("This is a white ...") 
TenniesShoes() 
TenniesShoes("This is Tennis Shoes") 
Shoes("Exam1") 
Object() 

之後,調用堆棧是解開所有的版畫被稱爲依次是:

  1. Shoes("Exam1")打印"Exam1"
  2. TenniesShoes("This is Tennis Shoes")打印"This is Tennis Shoes"
  3. TenniesShoes()打印"derived class"
  4. WhiteTennisShoes("This is a white ...")打印"This is a white ..."
  5. main無法打印並退出。
+0

非常感謝你!我試圖從你的步驟中瞭解。但是由於我不使用它,這使我很困惑。 '這(「這是網球鞋」);'這是什麼意思? –

+0

哦,哦,我現在閱讀你的步驟後,意味着什麼。男人你是如此的有幫助!讓我繼續。當我在考試中遇到這樣的問題時,我認爲對我來說更好。 –

+0

2我不知道的東西/ awareOF 1-Java爲我創建一個'Super()',如果我沒有創建一個2-在調用構造函數的構造函數內,因爲我從來沒有嘗試過。但現在很明顯。非常感激 。 –

0

當你沒有指定父類的構造在Java中的類來調用,默認的父類的構造被實例化時調用。在你的情況下,創建一個新的WhiteTennisShoes將自動調用默認的父構造函數,即TennisShoes()。這將調用TennisShoes(),然後調用Shoes(String)

在這種情況下要記住的重要一點是,在Java中,實例化一個類將調用該類和每個父類的構造函數。您可以指定要調用的父構造函數,如果不指定,則調用默認的no-arg父構造函數。

0

您調用WhiteTennisShoes構造函數。這個構造函數沒有super()調用,所以編譯器會爲你插入一個,因此它的第一件事就是調用它的超類的無參數構造函數:TennisShoes。

沒有任何參數的TennisShoes構造函數調用「This is Tennis Shoes」作爲參數的其他構造函數。這個構造函數的第一個作用是以「Exam1」作爲參數來調用它的超類的構造函數。

Shoes構造函數因此被調用Exam1作爲參數,並輸出Exam1。然後TennisShoes構造函數繼續執行並輸出它的參數:「這是網球鞋」。然後TennisShoes無參數構造函數繼續執行並輸出「派生類」。然後WhiteTennisShoes的構造函數繼續執行並輸出它的參數:「這是一個白色的網球鞋被創建」。