簡體   English   中英

覆蓋Java中的受保護方法

[英]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的適當部分的鏈接。

在這里,您可以使用protected關鍵字JLSJLS受保護的描述受JLS保護的示例

基本上是一個protected改性劑意味着你可以在給定的類的子類訪問字段/方法/ ... 1) 2)從在同一包中的類。

因為2) new A().test()起作用。 但是new B().test()不起作用,因為B類在不同的包中。

這不是繼承在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM