下面的代碼產生當能見度改爲private
重寫方法和變量 - 不一致的行爲
這是可以理解的,但奇怪的是重寫的變量不會產生任何錯誤彙編覆蓋的方法getName()
,時間誤差。
class Base {
public String getName() {
return "Base";
}
public String className = "Base";
}
class Derived extends Base {
private String getName() { //Not compiling
return "derived";
}
private String className = "Derived"; //Compiling successfully
}
public class Test{
public static void main(String[] args) {
System.out.println((new Derived()).className);// Gives compilation error
}
有人能幫我理解爲什麼會發生這種情況嗎?
雖然我們試圖訪問main()
編譯私有變量失敗,但在方法中自當我從公衆減少接入類型私人它編譯成功它應該有失敗有作爲。
你不能覆蓋方法並改變它的簽名修飾符。 – matoni
@matoni,當然可以。例如,不是「public」>「private」。 – rorschach
@matoni根據Liskov Substitution原則,訪問修飾符比基類中的更少,這是錯誤的。但是如果你願意的話,你可以在子類中使它更公開。 – Matthias