2014-12-22 67 views
0

從讀一本書重載的構造函數,我累了下面的代碼後:重載構造

public class Employee { 

    String name; 
    int idNumber; 

    public Employee(){ 
     this("JJ", 0); 
     System.out.println(name +" "+ idNumber); 
    } 

    public Employee(String name, int num){ 

     this.name = name; 
     idNumber = num; 
     System.out.println(name +" 2nd "+ idNumber); 
    } 
} 


public class Object1 { 

    public static void main(String[] args) { 

     Employee emp = new Employee(); 
    } 

} 

OUTPUT:

JJ 2nd 0 

JJ 0 

我真的很困惑。爲什麼「JJ 2nd 0」先打印出「JJ 0」?我創建了一個employee對象emp,並沒有傳入參數中的任何參數,是不是假設先調用第一個構造函數?

+2

或許,如果人們使用的調試器(HTTP:/ /www.vogella.com/tutorials/EclipseDebugging/article.html)更多,這不會是一個問題。 – Qix

+0

@Qix謝謝。從來沒有聽說過調試器,但我沒有谷歌它,我現在要學習如何使用它。 – OPK

+1

我剛剛意識到,您已經提出了一些問題,但尚未接受任何答案。接受一些,如果他們真的有用,可能是一個好主意,既是一種說「謝謝」的方式,也是向未來的用戶表明看問題的答案最能回答問題。 –

回答

5

new Employee();被調用

public Employee(){ 
    this("JJ", 0); 
    System.out.println(name +" "+ idNumber); 
} 

在此構造

this("JJ", 0);

正在調用

public Employee(String name, int num)

構造,其與呼叫

System.out.println(name +" 2nd "+ idNumber);結束。

負責印刷

JJ 2日0

this("JJ", 0);將完成System.out.println(name +" "+ idNumber);將被調用,你應該看到另一條線路

JJ 0

2

的無參數的構造函數調用其他的構造與下面的行參數:

this("JJ", 0); 
+4

不知道這是怎麼回事... –

+1

不能同意更多。回答這個問題。 – Adam

4

當你寫道:

... new Employee(); 

你最終調用默認的(無參數)構造函數。在構造函數中的第一行的代碼是:

this("JJ", 0); 

它調用2參數的構造函數,在其中你寫

System.out.println(name +" 2nd "+ idNumber); 

這是第一次兩個輸出報表程序的遭遇,因此是您在控制檯中看到的第一件事。

該輸出語句後,程序返回到默認的無參數的構造函數,並繼續執行你的其它輸出語句

System.out.println(name +" "+ idNumber); 

這是你看到的「第二」輸出語句。

如果你用調試器遍歷你的代碼,一行一行,你將會看到程序的執行過程,並且應該證明我指的是什麼。

0

它確實首先調用第一個構造函數,但其​​中的第一行是對第二個構造函數的調用。當您使用main方法創建Employee對象時,可以調用構造函數Employee(),但不帶參數(第一個參數)。該構造函數首先調用第二個構造函數,該構造函數打印JJ 2nd 0,然後,第一個構造函數打印行JJ 0。這是它如何被執行:

  1. 當被稱爲main方法,第一個構造函數,new Employee(),被調用。
  2. 該構造函數調用第二個構造函數。
  3. 第二個構造函數打印JJ 2nd 0,然後完成。
  4. 第一個構造函數繼續下一行,即System.out.println(name +" "+ idNumber);,並打印JJ 0
1

您必須閱讀有關這個​​關鍵字進行,只是開始的像和傻冒使用類的對象,

     See in the first constructor this("JJ","0") means that a constructor having two arguments is being invoked so the first line redirects the control into the second constructor that's is why the other line is printed first.