[問題] 多型的概念

作者: birdy1147 (Allen)   2016-04-14 13:08:26
class Father{
String name = "Father";
String getname(){
return name;
}
String greeting(){
return "class Father";
}
}
class Son extends Father{
String name= "Son";
String greeting(){
return "class Son";
}
}
public class Polymorphism{
public static void main(String[] args){
Father fa = new Son();
System.out.print(fa.greeting()+", ");
System.out.print(fa.name+", ");
System.out.println(fa.getname());
}
}
請問以上的程式執行結果
第一個print為class Son
沒問題。因為覆寫
第三個print為Father
沒問題。因為父類別中才有這個方法
第二個我不懂
為什麼結果是Father 而不是Son呢?
最後實際執行的實體
不是new Son( ); 嗎?
怎麼理解,感謝
作者: snowlike (.zZ)   2016-04-14 14:06:00
先不論怎麼理解,第二個和第三個如果不同實際上更奇怪name 實際上有兩個只是 son 裡的 name 產生了遮蔽的效果
作者: bitlife (BIT一生)   2016-04-14 14:14:00
docs.oracle.com/javase/specs/jls/se7/html/jls-4.htmlThe Java programming language is a statically typedlanguage, which means that every variable and everyexpression has a type that is known at compile time.
作者: snowlike (.zZ)   2016-04-14 14:51:00
因為你看的是 Fa 的 name,會提遮蔽就是因為非繼承關係樓上是 Fa 和 So 的變數都存在的意思不用再往繼承思考
作者: bitlife (BIT一生)   2016-04-14 15:58:00
不是告訴你在compile time就確定型別了嗎?^variable
作者: ntuarthur (ntuarthur)   2016-04-14 16:07:00
virtual method table
作者: bitlife (BIT一生)   2016-04-14 22:14:00
多型和確定型本身就是相反的概念,多型是在執行時期為了確定要使用那個method,所以需要確定執行時期的型別,而field的存取,在編譯時期就決定了要存取哪個型別的某個field要存取name,所以fa在編譯時期就確定了它是Father型別那個fa = new Son(); 是人類望文生義理解它實際會是Son,但compile time沒有這個資訊(別期待編譯器像人一樣「懂」),如果你是寫 Father fa = someFunction() 呢,不把整個程式實際跑一遍是不可能在compile time知道的.總之,多型是到run time再查真實型別以執行對應該執行的method實務則用virtual function/method table來做,把問題提早到編譯時期即可解決,但field不能這樣幹,因為field如前面所說,不是pure virtual,只是被子代遮掉,實際上有兩份,pure virtual function在virtual function/method table中,子代的method會蓋掉親代的method更正,上面的pure都去掉,和pure與否無關(C++的virutal在Java是預設,而C++的pure virtaul變成了Java的virutal,我寫的時候一直想著C++的實務,才多寫pureabstract XD
作者: ntuarthur (ntuarthur)   2016-04-15 15:41:00
樓上乾脆回一篇比較好讀。或者就給他key word XD

Links booklink

Contact Us: admin [ a t ] ucptt.com