域和方法不同
刪除了類的一個方法後
它有可能通過繼承獲得一個具有同樣名稱
參數的不同方法
但域不能覆蓋
這使得域在二進制兼容方面的表現也有所不同
例如
假設有下面三個類
class Language {
String greeting =
你好
;
}
class German extends Language {
String greeting =
Guten tag
;
}
class French extends Language {
String greeting =
Bon jour
;
}
則
void test
() { System
out
println(new French()
greeting); }
的輸出結果是
Bon jour
但是
void test
() { System
out
println(((Language) new French())
greeting); }
的輸出結果是
你好
這是因為
實際訪問的域依賴於實例的類型
在第一個輸出例子中
test
訪問的是一個French對象
所以輸出結果是French的問候語
但在第二個例子中
雖然實際上訪問的是一個French對象
但由於French對象已經被定型成Language對象
所以輸出結果是Language的問候語
如果把上例的Language改成下面的形式
class Language { }
再次運行test
(不重新編譯)
得到的結果是一個錯誤信息
java
lang
NoSuchFieldError: greeting
如果重新編譯test
則出現編譯錯誤
cannot resolve symbol
symbol : variable greeting
location: class Language System
out
println(((Language) new French())
greeting);
test
仍能正常運行
無需重新編譯
因為它不需要Language包含的greeting變量
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19380.html