2013-07-30 49 views
0

我真的很想理解這些實時使用是什麼:爲什麼動態方法派遣和超類派可以引用一個子類對象?

1.什麼是Java概念的使用 - 「超類變量可以引用子類對象」? 即使這樣做,SuperClass變量只能用於訪問由SuperClass定義的對象的那些部分,但不能訪問子類成員。甚至可以通過子類對象來實現。

2.動態方法調度需要什麼?我有下面的例子:

class A 
{ 
    void disp() 
    { 
     System.out.println("in A"); 
    } 
} 
class B extends A 
{ 
    void disp() 
    { 
     System.out.println("in B"); 
    } 
} 
class C extends A 
{ 
    void disp() 
    { 
     System.out.println("in C"); 
    } 
} 
public class mainclass 
{ 
    public static void main(String[] args) 
    { 
     A a= new A(); 
     B b=new B(); 
     C c=new C(); 
     A ref; 
     ref=b; 
     ref.disp();//calls class B method 
     ref=c; 
     ref.disp();//calls class C method 
     ref=a; 
     ref.disp();//calls class A method 
    } 
} 

這上面的代碼通過分配不同的子類對象的父類引用變量使用動態方法分派。 我的問題是爲什麼要使用「ref」併爲其分配對象,然後調用函數?我們可以調用子類函數,即使不使用這個「ref」和對象分配(動態分派)。

我們可以這樣調用也:

a.disp();//calls A method 
b.disp();//calls B method and so on. 
c.disp(); 

誰能幫我瞭解實時使用這兩個概念?

在此先感謝。

+2

如果你剛開始,只是學習這種方式。當你編寫複雜的問題,並使用模式,你會明白:-) – Ankit

+0

http://en.wikipedia.org/wiki/Polymorphism_(computer_science) – fGo

+0

這個例子是顯示相同的調用'ref.disp() '行爲不同,取決於分配的對象的實際類型!你是對的,'a.disp()''b.disp()'和'c.disp()'會做同樣的事情,但它不會顯示多態行爲。 –

回答

5

運行時多態性是一種實現Coding to Interface, rather than implementation的方法!

多態性就像聲明一個統一的接口一樣,將實現細節留給實現該接口的具體類型。這就像定義一個合同綁定到所有實現接口的人一樣。這使對象能夠在不知道確切類型的情況下與對方進行交互。

讓我們假設你有一個方法(簡單的例子):

public boolean remove(List list) { 
    return list.remove(); 
} 

由於已經定義List類型的接口參數,它是開放採取的List實現的任何對象在運行時。這樣,只要傳遞給此方法的對象實現List,您就不必爲每個List實現編寫單獨的方法remove()

還可以閱讀:

  1. Liskov substitution principle
  2. Open/closed principle
相關問題