2017-03-01 44 views
-4

當我運行這段代碼的輸出是(敏@ 15db9742)-object地址 - :覆蓋的toString(),但數據類型是整型

public static void main(String[] args) { 
    MyInt myInt = new MyInt(2); 
    System.out.println(myInt); 
} 

class MyInt { 
    public int val; 
    public MyInt(int val){ 
     this.val = val; 
    } 
} 

我想要做的是:打印VAL無myInt.val

我試着重寫toString()?!

public String toString(){ 
    return ""+val; 
} 

它的工作原理!但我想返回類型爲int /整數字符串,並有一個編譯器錯誤

的返回類型與Object.toString不兼容()」

當我改變的返回類型爲int有沒有辦法做到這一點

編輯:?

在短:

Integer integer = new Integer(5); 
int INT = integer; 
System.out.println(INT); 

所以我想myClass的「敏」的工作原理是一流的「整數」 這樣我就可以分配INT VAL直接

MyInt myInt = new MyInt(5); 
int INT = myInt; // I don't need to type "myInt.val" 
System.out.println(INT); 
+2

你爲什麼要改變返回類型?如果你想要一個返回一個'int'的方法只需要一個不同的方法。 – resueman

+9

不可以。「toString()'的全部要點是將一個類**轉換爲一個String **。 – azurefrog

+0

我希望(int val)在我調用對象myInt時被返回。例如:String s = new String(「Hello」);印刷(一個或多個);它會返回「你好」而不是地址 – AndroidDev

回答

1

你似乎誤解了幕後發生的事情,當你調用這個:

System.out.println(myInt); 

println方法接受一個Object參數,然後調用對象的方法.toString()toString()方法總是返回一個字符串。因此你做了什麼(返回一個字符串)是正確的。

注意,當你這樣做:

System.out.println(1); 

再有就是println超載專門爲int參數。但是你不能傳遞一個對象到println,並期望它被視爲一個原始類型。

+0

所以,當我創建一個「Integer i = new Integer(3); System.out.println(i);」的對象時,它實際上返回i.toString()? – AndroidDev

+0

確實。請參閱[源代碼](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/PrintStream.java#PrintStream.print%28java.lang .Object%29) –

6

這是錯誤的一個概念和代碼質量水平。

該方法被稱爲toString()。每個Java程序員都知道這件事情應該做什麼(提供一個字符串表示你調用它的對象)。每個Java程序員都希望此方法返回字符串,而不是int。長話短說:不是重寫現有的方法,而是完全改變他們的行爲(順便提一下,什麼是一個超級壞主意):簡單地添加你自己的新方法,並給出一個合理的名字。

最後:你的想法(改變方法的「契約」)通常是違反了Liskov Substitution Principle。含義:不要做事情,因爲你可以做他們。相反,真的要學習和理解你打算使用的概念。我在說什麼:適當的繼承在良好的OO設計是超過把一些延伸關鍵字的某處;和一些方法聲明前的@Override。

+0

沒有評論! <><><> – AndroidDev

+1

我不得不承認:我不確定你打算用你的非評論告訴我什麼。 – GhostCat