2013-02-01 33 views
2

說我有一個名爲ParentClass類和一個名爲ChildClass當實例化一個(子)類時,你聲明對象的「type」有什麼區別?

ParentClass是抽象的和ChildClass擴展ParentClass按Java的術語類。此外,ParentClass有一個構造函數,它以int作爲參數。現在在另一個課程中,我想實例化ChildClass。我已經嘗試了兩種方式如下:

  1. ChildClass obj1 = new ChildClass(5)
  2. ParentClass obj2 = new ChildClass(5)

Java允許我使用任何上述兩種方式。我的問題是,實際上有什麼區別嗎?如果我願意,我可以交換使用這兩種嗎?

回答

5

兩者都工作,並且都在內存中創建相同的對象。但只有第一個允許您使用ParentClass不知道的ChildClass附加特定屬性或方法。

例子:

abstract class ParentClass{ 
    ... 
} 

class ChildClass extends ParentClass { 

    public void SomeChildMethod(){ ... } 
    ... 
} 

... 


ChildClass obj1 = new ChildClass(5); 
ParentClass obj2 = new ChildClass(5); 

obj1.SomeChildMethod(); // ok 
obj2.SomeChildMethod(); // compilation error 
((ChildClass)obj2).SomeChildMethod(); // ok 

所以,只使用,如果你相信你會永遠需要兒童的具體方法或屬性,如果有第二個實例方法。

1
  • 如果他們有相同的方法只是孩子實現了 抽象方法那麼就沒有任何差別。
  • 如果您添加了附加方法,那麼如果您將其聲明爲父項,那麼該子項將不會被 訪問。
2

創建的對象實際上是相同的。

第一種方法允許您使用ChildClass中定義的方法,而不是ParentClass中定義的方法。所以

obj1.aMethodNotInParentClass(); 

編譯而

obj2.aMethodNotInParentClass(); 

沒有。

或者,使用第二種形式可以更容易地用其他實現替換內部類。如果你想使用AnotherChildClass代替ChildClass

 ParentClass obj2 = new AnotherChildClass(5); 

是你需要做的(假設類正確定義)的所有變化;使用第一種方法可能需要在代碼的其他地方進行一些更改。作爲一個經驗法則,將變量定義爲更一般的類,它定義(*)所需的對象的所有方法。因此,如果您使用ParentClass中未定義的ChildClass的任何方法,請使用第一種方法,否則請使用第二種方法。(*)請注意,我提到定義,而不是實施。如果覆蓋ChildClass中的方法,則將使用該實現,因爲創建的對象是該類的。

2

在內存中將使用完全相同的對象。但是,只能使用變量obj2,就好像它包含ParentClass對象,而不會將ChildClass類的所有功能都視爲理所當然。如果ChildClass聲明方法f(),但ParentClass沒有,則調用obj2.f()將不起作用 - 儘管內存中的對象可以很好地運行該方法。

1

第二個選擇將只允許使用在ParentClass中聲明的方法。例如:

public class ParentClass { 
    public void doX() {} 
} 

public class ChildClass { 
    public void doY() {} 

    public static void main() { 
     ParentClass p = new ChildClass(); 
     ChildClass c = new ChildClass(); 
     p.doX(); //works 
     c.doX(); //works 

     p.doY(); //not allowed 
     c.doY(); //works 


     ((ChildClass) p).doY(); //this way you cast the object to ChilClass and can use its methods. 

    } 
} 
0

是的,是有區別的。 第一種方法使用動態綁定爲您提供一個子實例作爲父對象。這隻會將父對象的功能提供給子實例。 第二種方法將爲您提供一個子對象作爲子對象的實例,允許您使用其所有方法及其父對象方法,而不僅限於父類的方法。

相關問題