2014-10-01 27 views
1

我知道,在處理Java中的多態性時,可以爲對象指定與對象類型不同的聲明類型。例如:Java中具有不同引用類型的對象類型的優點是什麼?

Parent foo = new Child(); 

我主要是看到它時聲明的類型是一個接口,如:

Map<Integer,BigInteger> memo = new TreeMap<Integer,BigInteger>();  

我這看到了很多在人們的Java代碼。當它是一個Child對象時,將foo聲明爲Parent有什麼好處?我也明白,如果我們這樣做,foo不能再調用任何未在Parent中聲明爲抽象或定義的方法。令我感到困惑的是,當我們可以同時擁有聲明和實際類型的Child並且仍然將其作爲參數傳遞給需要Parent參數對象的方法時,我看到了這一點。例如:

Child fooNew = new Child(); 
    public void showObj(Parent o){ 
     System.out.println(o); } 
    showObj(fooNew); 

那麼是什麼給?在什麼情況下爲對象設定不同的聲明和實際類型會有好處?我的書說它對泛型編程很重要,但沒有解釋。我看到它始終如一地使用,但毫無頭緒。它甚至似乎有其自身的一些缺點。

+0

從Oracle瞭解孩子:http://docs.oracle.com/javase /tutorial/java/generics/why.html – 2014-10-01 04:37:29

+0

@ScaryWombat原理是一樣的。 – ajb 2014-10-01 04:37:50

+0

當父母有多個孩子覆蓋一個或多個父母方法時,這是有意義的。您可以將不同子項的實例放入由父類型定義的某些集合中,並且在調用重寫方法時,JVM將爲每個子實例適當地調用此方法。 – 2014-10-01 04:38:45

回答

0

您可能有許多繼承自Parent類的類。 foo變量可以存儲任何這些類的實例,並且使用它的代碼可以是通用的(即,它可以在不知道使用了哪個特定的父類子類的情況下工作)。

使用接口類型(如Map)的變量並在其中存儲對實現該接口的實例的引用也是如此。

+0

你介意擴大「使用它的代碼可以更普遍」。 – bmcentee148 2014-10-01 04:40:42

+0

@ bmcentee148如果代碼僅依賴於用作變量類型的接口/超類的方法,則它可以與超類的接口或子類的許多不同實現一起工作(即使這些實現在編寫可用的代碼時尚未開發)。 – Eran 2014-10-01 04:44:18

+0

謝謝,我開始明白了。 – bmcentee148 2014-10-01 04:52:40

1
Parent foo = new Child(); 

當您稍後意識到有更好的孩子可以使用時,優勢就會起作用。因此,在不改變任何其他的代碼,你可以用你的更好的兒童:

Parent foo = new BetterChild(); 

BetterChild顯然應該是Parent

相關問題