2017-05-28 79 views
-2

嗨,大家好我需要一些幫助,以瞭解更好的構造函數和方法。爲什麼java的先調用第一個構造函數,而不是默認?:爲什麼java在這種情況下先調用NOT default構造函數?

public class Human { 
    private String name; 
    private int age; 

    public Human() { 
     this("Alex", 25); 
     System.out.println("Default constructor called"); 
    } 

    public Human(String name, int age) { 
     this.name = name; 
     this.age = age; 
     System.out.println("First constructor called"); 
    } 

    public Human(String name) { 
     this.name = name; 
     System.out.println("Second constructor called"); 
    } 

    public String info(){ 
     return name+" "+age; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } } 

package com.company; 

public class Main { 

    public static void main(String[] args) { 
     System.out.println("Create object 1"); 
     Human person = new Human(); 
     System.out.println(person.info()); 
     System.out.println("Create object 2"); 
     Human person2 = new Human("Mike",55); 
     System.out.println(person2.info()); 
    } 
} 

所以輸出是:

Create object 1 
First constructor called 
Default constructor called  
Alex 25 
Create object 2 
First constructor called 
Mike 55 
+3

它** **不叫「默認」構造 - 不然怎麼解釋中的'默認的構造called'你的輸出? –

+0

@OliverCharlesworth OP問爲什麼默認的構造函數被稱爲第二 – niceman

+0

好吧,我明白,我有「這個」,但爲什麼輸出字符串「System.out.println(」默認構造函數調用「);」是第二個? – Ess

回答

3

這樣的說法:

Human person = new Human(); 

會打電話的默認的構造函數是def獨立非執行董事喜歡這裏:

public Human() { 
    this("Alex", 25); 
    System.out.println("Default constructor called"); 
} 

現在的第一條語句this("Alex",25)將調用定義的另一個構造這裏:

public Human(String name, int age) { 
    this.name = name; 
    this.age = age; 
    System.out.println("First constructor called"); 
} 

這等構造設置了一些實例字段,然後打印「被稱爲第一個構造函數」,當它完成我們返回到我們的默認構造函數this("Alex",25),並返回到打印出「Default constructor called」的下一條語句。

簡而言之:您的打印成功調用其他構造函數,這使得您認爲其他構造函數被首先調用。

+1

你的回答非常好,然後你在最後一句話中搞砸了。你不能在'this(「Alex」,25);'之前放置打印語句。不允許!! – Andreas

+0

@Andreas感謝您指出這一點 – niceman

+0

這裏'Human'類沒有默認構造函數。 –

3

這正是表現爲它應該,讓捲起的函數調用:

System.out.println("Create object 1"); 
Human person = new Human(); 
--this("Alex", 25); 
----this.name = name; 
----this.age = age; 
----System.out.println("First constructor called"); 
--System.out.println("Default constructor called"); 
System.out.println(person.info()); 
System.out.println("Create object 2"); 
Human person2 = new Human("Mike",55); 
--this.name = name; 
--this.age = age; 
--System.out.println("First constructor called"); 
System.out.println(person2.info()); 
相關問題