[英]Overriding protected methods in Java
Test.java
package a;
import b.B;
public class Test {
public static void main(String[] v) {
new A().test();
new B().test();
}
}
A.java:
package a;
public class A {
protected void test() { }
}
B.java:
package b;
public class B extends a.A {
protected void test() { }
}
為什么new B().test()
會出錯? 這不會破壞可見性規則嗎?
B.test()
在Test
是不可見的,因為它們位於不同的包中,但它拒絕在B
的超類中調用test()
,這是可見的。
將贊賞與JLS的適當部分的鏈接。
這不是繼承在Java中的工作方式。
如果方法被覆蓋,並且重寫的方法不可見,則嘗試調用它是編譯時錯誤。
您似乎期望Java會自動回退到超類中的方法,但這種情況不會發生。
我稍后會嘗試挖掘JLS為什么沒有這樣做...
問題是,在編譯時,您告訴Java,當您沒有此類訪問權限時,您希望訪問類的受保護成員。
如果你這樣做了;
A a = new B();
a.test();
然后它將工作,並且重寫的方法將運行,因為在編譯時Java檢查您是否有權訪問A.在運行時,提供的對象具有適當的方法,因此執行B test()方法。 動態綁定或后期綁定是關鍵。
是的,可以覆蓋受保護的方法。
class A{
protected void f(){
SOP("A");
}}
class B extends A{
protected void f(){
SOP("B");
}
public static void main(String...args)
{
B b=new B();
b.f();
}
}
輸出:B
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.