2017-05-09 24 views
3

這裏是我的示例代碼:調用toString()時,將字符串轉換爲對象

String str = "hello"; 
Object obj = (Object)str; 
System.out.println(obj.toString()); 

我發現對象的源代碼,和toString()方法是:

public String toString() { 
    return getClass().getName() + "@" + Integer.toHexString(hashCode()); 
} 

我想示例的結果是這個對象的地址,就像[B @ 15db9742,在我將str轉換爲Object之後,但它仍然打印出你好。爲什麼? Shoundn't obj使用Object的方法嗎?任何人都可以向我解釋它的原理嗎?

+5

歡迎[多態性(https://en.wikipedia.org/wiki/Polymorphism_(computer_science))。 :-) *(必須有一個dupetarget這個。)* –

+0

*方法覆蓋* - 您只更改引用類型,實際對象是*仍然是String *,而'String'的'toString'返回實際的字符串 – TheLostMind

+1

請查看以下問題:http:/ /stackoverflow.com/questions/321864/java-dynamic-binding-and-method-overriding –

回答

2

由於底層對象是一個String對象,並且String類已覆蓋其中的toString()方法。

雖然左側是Object類型,但實現類中的方法獲取執行並獲得稱爲Polymorphism的整體現象。您只是將字符串的形式更改爲對象。

當你

Object obj = (Object)str; 

不改變的字符串對象類。你只是改變對象的類型而不是它的實際行爲。

1

虛擬方法調用意味着方法覆蓋將在給定實際實現的情況下執行,而不是參考類型中的實現。

換言之,您的String實例仍會調用String中實施的Object的替代方法,即使轉換爲Object

5

這是polymorphism(具體來說,運行時多態性)。只要該類型具有toString(因此您的代碼已編譯),那麼將使用的toString就是該對象本身實際擁有的那個類型,這與您對該對象的引用類型(ObjectString)無關,不一定是您提及的類型提供的那個。在這種情況下,無論您引用的是什麼類型,對象都是String,因此使用String#toString

0

對象OBJ是(不必要)鑄造的結果,但仍然是一個字符串.... String類具有的toString方法的一個實現超越控制:

public String toString() { 
    return this; 
} 

驗證obj是一個字符串做:

System.out.println(str.getClass()); 
System.out.println(obj.getClass()); 

你會得到

類java.lang.String

類java.lang.String