2012-07-02 69 views
2

我是做研究,我發現了以下工作:在Java中關於構造

讓我們假設我有一個像下面這樣的一類,與下面的構造函數:

public class Triangle implements Shape { 

    public String type; 
    public String height; 

    public Triangle(String type) { 
     super(); 
     this.type = type; 
    } 

    public Triangle(String height) { 
     super(); 
     this.height = height; 
    } 

    public Triangle(String type, String height) { 
     super(); 
     this.type = type; 
     this.height = height; 
    } 
} 

這給了我編譯時錯誤。但如果我將heightString更改爲int一切正常。下面是改變的一段代碼:

public class Triangle implements Shape { 

    public String type; 
    public int height; 

    public Triangle(String type) { 
     super(); 
     this.type = type; 
    } 

    public Triangle(int height) { 
     super(); 
     this.height = height; 
    } 

    public Triangle(String type, int height) { 
     super(); 
     this.type = type; 
     this.height = height; 
    } 
} 

現在的問題是:假設我想作爲String作爲height在我的第一種情況;爲什麼它失敗了?請解釋。

+0

抽動工廠我可以問你的IDE使用哪個? –

+0

你應該總是設計你的類的功能 - 那麼爲什麼高度是一個字符串呢? –

+0

順便說一下,你不需要輸入對'super()'的調用,如果你沒有指定任何其他的構造函數調用,Java將自動進行調用。 – Keppil

回答

9

你不允許超載具有構造相同簽名

爲什麼?

雖然解決方法/構造函數調用JVM需要的東西唯一標識方法(返回類型是不夠的),所以參數的構造函數/方法不能是同一


+3

這是因爲當你調用新的Triangle(「yourStringHere」)時,在你的第一個代碼中,java將無法知道使用哪個構造函數。 –

8

你哈有兩個具有相同參數的構造函數。他們都以一個字符串作爲參數。

如果我打電話給Triangle tri = new Triangle("blah");無法判斷「blah」應該是高度還是類型。你可以通過查看它來判斷,但JVM不能。每個構造函數都必須有唯一的參數。

+0

@Robers感謝人完美的探索 – user1493927

1

在第一種情況下編譯錯誤的原因是,當您通過傳遞字符串參數初始化類Triangle的對象時,編譯器將如何知道要調用哪個構造函數;初始化類型或初始化高度的類型。 這是編譯器的模糊代碼,因此會引發錯誤。 就像我說的那樣;

Triangle t = new Triangle("xyz"); 

沒有人能夠知道哪個變量會被初始化;類型或高度。

0

如果您想爲構造函數使用兩個字符串,您可以將字符串轉換爲Value對象。

http://c2.com/cgi/wiki?ValueObject

例如:

class Height { 
    private String height; 

    public Height(String height){ 
     this.height = height; 
    } 

    public String value(){ 
     return this.height; 
    } 

    @Override 
    public String toString(){ 
     return height; 
    } 

    @Override 
    public boolean equals(Object other){ 
     return this.height.equals((Height)other).value()); // Let your IDE create this method, this is just an example 
     // For example I have missed any null checks 
    } 
} 

然後,如果你做的類型相同,你可以有兩個構造函數:

public Triangle(Type type) { 
    this.type = type; 
} 

public Triangle(Height height) { 
    this.height = height; 
} 

而且類型是聽起來像它可能是一個enum

1

或者您可以添加sta爲你的類

public class Triangle implements Shape { 

... 

private Triangle(int height) { 
    // initialize here 
} 

private Triangle(String type) { 
    // initialize here 
} 

private Triangle(String type, int height) { 
    // initialize here 
} 

public static createByHeight(String height) { 
    return Triangle(Integer.parseInt(height); 
} 

public static createByType(String type) { 
    return Triangle(type); 
} 

public static createByTypeAndHeight(String type, String height) { 
    return Triangle(type, Integer.parseInt(height); 
} 

}