2011-04-08 82 views
0

現在我試圖用int代表一個二進制數來實現this interface瞭解java中的接口,類和構造函數

我知道我不應該執行to string();,但讓我們假設我需要。

這是我寫到目前爲止:

public class IPAddressInt implements IPAddress { 
private int ipAdress; 

public IPAddressInt(int num1,int num2, int num3, int num4){ 
    String n1=Integer.toBinaryString(num1); 
    String n2=Integer.toBinaryString(num2); 
    String n3=Integer.toBinaryString(num3); 
    String n4=Integer.toBinaryString(num4); 

    String finalString=n1+n2+n3+n4; 
    this.ipAdress=Integer.parseInt(finalString); 
} 

public String toString() { 
    return this.toString(); 


} 

當我特林返回this.ipAdress.toString();甚至ipAdress.toString() 編譯器說,它Cannot invoke toString() on the primitive type int, 當我只寫 this.toString();它的工作原理。爲什麼?我知道一個int可以轉換爲一個字符串,並且this是如何工作的,整個聲明不是?不應該是一樣的嗎?我會得到我想要的嗎?

謝謝。

+0

@Andrew:Lol。我改變了它。 – 2011-04-08 09:23:04

+0

很高興看到你有幽默感和常識。 :-)希望你得到一個滿意的解決方案。 – 2011-04-08 10:23:57

回答

4

調用this.toString()只是要炸燬 - 它的遞歸調用同樣的方法,沒有退出。

您不能直接撥打toString的原因是是原始類型,您不能在原始類型上調用方法。

任何東西轉換爲字符串,使用String.valueOf(ipAddress)。特別是對於int,您可以使用Integer.toString(ipAddress)

它爲什麼你儘管這樣做在第一時間轉化爲二進制字符串沒有真正明確表明看起來並不像一個好主意,我。任何你不使用的原因

ipAddress = (num1 << 24) | (num2 << 16) | (num3 << 8) | num4; 

(假設每個值真的在0-255範圍內)。

高度疑問的二進制表示是真的想你想要的,特別是考慮到缺少的填充物,而你則試圖解析它作爲一個十進制數

+0

@Jon:謝謝你的評論。 你能解釋一下你創建這種ipAddress的過程嗎? 以我的方式實施它是錯誤的嗎?我想這不會是整數,因爲左邊的零不會出現,對吧? – 2011-04-08 09:01:15

+0

@Nir:你不明白你的意思。通常,通過使用字符串轉換,將一個數字表單(在本例中爲4個獨立整數)轉換爲另一個數字表單(本例中爲1個整數)幾乎不是一個好主意。 – 2011-04-08 09:06:23

+0

@Jon:我想了解這個表達式:'ipAddress =(num1 << 24)| (num2 << 16)| (num3 << 8)| num4;'的意思。 使用這個按位運算符,你會得到數字自動轉換爲二進制表示? – 2011-04-08 09:13:01

0

當你說「它有效」時,我懷疑你的意思是「它編譯」。如果你實際調用toString方法,你會得到一個堆棧溢出,或者如果你的編譯器/ JVM非常聰明,也許只是一個無限循環。

要將int轉換爲字符串,調用Integer.toString(this.ipAdress)。 (但最好拼寫正確address :-))。

[編輯補充:寫這之後我看到,在另一個答案喬恩斯基特喜歡String.valueOf,而不是Integer.toString用於這一目的。他是一個非常聰明的傢伙,可能有一個很好的理由。這將意味着少了,如果你改變的ipAddress類型改變 - 呃,我的意思是ipAdress,例如]

0

你想要什麼可能是執行toString方法是這樣的:

public String toString() 
{ 
    return Integer.toString(ipAdress); 
} 

編譯器說的是真的,因爲你不能在原始類型上調用任何方法。你必須將原始int包裝到一個Integer中,該Integer具有toString實現的方法。上面代碼段的代碼只是調用的一個更有效的方法:

return Integer.valueOf(ipAdress).toString(); 
0

你的toString方法是遞歸調用自身,並會在堆棧溢出異常結束。

嘗試轉換ipAdress到這樣的字符串:

公共字符串的toString(){ 返回Integer.toString(ipAdress); }

僅供參考,你的變量ipAdress有一個錯字,應該是ipAddress。