2015-01-06 33 views
2

比方說,我們有:爲什麼動態類型方法不可見?

interface A{ 
    void foo(); 
} 

class B implements A{ 
    void foo(){} 
    void doNothing(){} 
} 

創建A B實例

A object=new B(); 

爲什麼在object.doNothing()調用編譯錯誤長大的嗎?

+0

加一;公平的問題。語言是這樣設計的,因此您可以從中受益(例如程序穩定性)的編譯時類型檢查。其他語言(如VBA)比這更失敗。如果你知道*甚至*懷疑*'object'是一個'B',那麼你可以嘗試一個演員,之後你可以訪問'doNothing'。 – Bathsheba

回答

0

因爲A類型沒有#doNothing方法,並且變量object的編譯時間類型爲A

1

因爲objectA而在class A中,您沒有任何名爲doNothing的功能。

0

您的代碼看到object與外部接口AA沒有方法doNothing出現編譯錯誤。

1

因爲在編譯時,Compilter檢查引用類型的方法綁定。因此,該方法doNothing()不在接口A

在編譯時使用編譯器不能肯定,如果這些引用調用方法doNothing()實際上指的是哪個版本的方法 - 超類版本或子類版本。

1

因爲對象是A而A沒有名爲doNothing的方法。如果你想做doNothing方法,要麼把它添加到界面答:

interface A { 
    void foo(); 
    void doNothing(); 
} 

或創建對象爲B不A.

B object = new B(); 
2

您正在使用「多態性」。當你使用一個對象作爲它的父對象時,這是一種技巧。 假設此實現:

public interface Animal { 
    public void go(); 
} 

class Dog implements Animal { 
    public void go() { 
     walk(); 
    } 
} 
class Fish implements Animal { 
    public void go() { 
     swim(); 
    } 
} 
class Duck implements Animal { 
    public void go() { 
     fly(); 
    } 
} 

現在你可以這樣做:

Animal[] animals = {new Dog(), new Fish(), new Duck()}; 

現在,只要你想的動物去,你可以簡單地調用首選的數組元素的go();方法動物(沒有任何擔心他們的運動類型)

現在,你可以要求一條魚走路?沒有,因爲並非所有的動物都知道走路
這就是爲什麼你不能叫孩子的方法,父對象上,因爲家長認爲其子女一樣,它只是知道散步等

在你的問題,A接口只知道void foo();方法,並不知道有關void doNothing();方法。

相關問題