在下面的代碼中,我在b.printname();處得到一個編譯器錯誤。據我瞭解,錯誤在於編譯器以非多態方式有效地運行(即編譯器本質上只選擇查看操作數的左側,因此b是一個問題)。由於b的類型是Question,並且由於Question沒有no-args printName方法,所以會出現編譯錯誤。那是對的嗎? 現在假設這是正確的,我的問題是爲什麼?編譯器當然應該知道問題b是指實際上支持no-args printName方法的對象?例如。如果你看看編譯器在轉換方面的表現如何,那麼編譯器會因爲缺少一個更好的詞而多態行爲,或者以不同的方式使編譯器知道發生了什麼,操作數並根據該知識進行操作。一個例子是,如果接口類型是指實現接口的對象,則編譯器會查看語句的右側(即實現接口的對象)並決定不需要轉換。那麼爲什麼編譯器不這樣做呢,爲什麼它看起來並沒有看到所討論的對象實際上是一個藍色,而藍色確實支持no-arg方法printName?Java編譯時非多態性
public class Polymorf3 {
public static void main(String[] args){
Polymorf3 me = new Polymorf3();
me.doStuff();
}
public void doStuff() {
Bat a = new Bat();
Question b = new Blue();
//a.printName();
a.printName(a.name);
b.printName(); // Compiler Error:Required String Found no args
}
abstract class Question {
String name="Question_name";
public void printName(String name){ System.out.println(name);}
}
class Bat extends Question {
String name = "Bat_Bruce";
//public void printName(){ System.out.println(name);}
}
class Blue extends Question {
String name = "Clark";
public void printName() {System.out.println(name);}
}
}
因爲這裏'b'包含'Question'類的引用。 – Satya