比方說,我們有:爲什麼動態類型方法不可見?
interface A{
void foo();
}
class B implements A{
void foo(){}
void doNothing(){}
}
創建A B實例
A object=new B();
爲什麼在object.doNothing()調用編譯錯誤長大的嗎?
比方說,我們有:爲什麼動態類型方法不可見?
interface A{
void foo();
}
class B implements A{
void foo(){}
void doNothing(){}
}
創建A B實例
A object=new B();
爲什麼在object.doNothing()調用編譯錯誤長大的嗎?
因爲A
類型沒有#doNothing
方法,並且變量object
的編譯時間類型爲A
。
因爲object
是A
而在class A
中,您沒有任何名爲doNothing
的功能。
您的代碼看到object
與外部接口A
和A
沒有方法doNothing
出現編譯錯誤。
因爲在編譯時,Compilter檢查引用類型的方法綁定。因此,該方法doNothing()
不在接口A
在編譯時使用編譯器不能肯定,如果這些引用調用方法doNothing()
實際上指的是哪個版本的方法 - 超類版本或子類版本。
因爲對象是A而A沒有名爲doNothing的方法。如果你想做doNothing方法,要麼把它添加到界面答:
interface A {
void foo();
void doNothing();
}
或創建對象爲B不A.
B object = new B();
您正在使用「多態性」。當你使用一個對象作爲它的父對象時,這是一種技巧。 假設此實現:
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();
方法。
加一;公平的問題。語言是這樣設計的,因此您可以從中受益(例如程序穩定性)的編譯時類型檢查。其他語言(如VBA)比這更失敗。如果你知道*甚至*懷疑*'object'是一個'B',那麼你可以嘗試一個演員,之後你可以訪問'doNothing'。 – Bathsheba