2017-08-02 47 views
1

我正在用java中的向上轉換和向下轉換的概念,這也被稱爲擴大和縮小。Java中的上傳如何工作?

  • UpCasting(加寬)從派生類自動發生到基類。即它是否具有is-a關係。
  • 向下播放必須明確進行運行時檢查。

好的,我明白了一切。但是,在這種情況下它是如何工作的?

public class ObjPair { 
    Object first; 
    Object second; 

    public ObjPair(Object first, Object second) { 
     this.first = first; 
     this.second = second; 
    } 

    public Object getFirst() { 
     return first; 
    }  
    public Object getSecond() { 
     return second; 
    } 

    public static void main(String[] args) { 
     ObjPair objPair = new ObjPair("A",2.2); // Goes widning conversion 
     System.out.println(objPair.getFirst()); 
     System.out.println(objPair.getSecond()); 
    } 
} 

ObjPair objPair =新ObjPair( 「A」,2.2);

  • 這個正在經歷上溯造型,字符串反對和雙反對和國家越來越店在objPair。大..!!!

現在,當我做objPair.getFirst()objPair.getSecond()。它返回我A2.2

  • 它是如何記住字符串和雙精度的,加寬/ upcast應該記住超類的狀態和方法。
  • 它如何訪問子類的類型和值?
+0

那麼,在你的'ObjPair'中,它被存儲爲一個字符串和一個double。 – Nathan

+0

upcast後它被存爲Object,不是嗎?這就是上傳發生的地方。 – Ritesh

+3

此外,Object類還有一個toString()方法,它將使用println()。字符串和雙精度(從雙精度自動裝箱)覆蓋toString()以正確打印它們的值。 –

回答

3

對象引用的澆鑄會變化的對象。它簡單地允許將其分配到不同類型的引用。對象本身保持不變。

就你而言,它需要兩個Object引用,它檢查兼容性(那裏沒有問題),然後在Object類型的變量中設置引用。該實例本身並沒有改變。如果他們有覆蓋那些Object方法,那麼壓倒一切的方法將被調用。

因此,當涉及打印對象的部分時,它只是使用String.valueOf,它調用對象的toString()方法。從Object變量訪問的實例實際上是String對象,String重寫toString()以返回自身。 Double也覆蓋toString。這些覆蓋被調用,因爲實例仍然是String的一個實例,並且是Double的一個實例。只有參考是Object

請注意,您也有一個演員,從doubleDouble那裏。這隱含的拳擊確實更改對象 - 它需要一個原語,並從它創建一個新的Double

+0

如果需要,您可以將我的視覺示例添加到您的答案中。 – Nathan

1

請記住:在對象在內存它是什麼。如果您創建一個Double對象,則它是一個類似於數值的Double對象。

讓擁有參考變量使用超類型的事實並不影響參考在所有對象!

在你的例子中,自動裝箱的封面下創建一個Double對象,並且getSecond()返回一個對該對象的引用Double對象。

這就是這一切。

0

好吧,讓我們來看一個例子。你有一個大的方形框,命名爲對象和另一個小盒子。如果你把這個小盒子放在你的大盒子裏,小盒子和大盒子的所有屬性都在大盒子裏。 然後在小盒子裏面,有兩根棍子,你把第一根棍子標爲'A',其次是'2.2'。 現在大箱子可以看到小盒子裏面的東西。現在就在那個時候,這個小盒子裏有兩根棍子,並按照它們的方式標記。 (記住Object類始終是java中每個類的超類/父類)。

+0

這是正確的,除非屬性相同,否則大框看不到小框內實現的內容。在我的情況下,它需要toString()實現小框(雙和字符串)。 – Ritesh

0

如果你簡單地測試了此代碼:

public class Main { 

    public Object first; 
    public Object second; 


    public static void main (String[] args){ 
     Main a = new Main(); 
     a.first = new String("foo"); 
     a.second = 5; 

     System.out.println(a.first.getClass().toString()); 
    } 
} 

它輸出class java.lang.String。你可以看到它沒有被存儲爲Object。這是通過使用元數據來實現的。