簡體   English   中英

為什么我允許“直接訪問”對象的受保護字段,該對象的類在其他包中定義?

[英]Why am I allowed “direct access” to an object's protected field, whose class is defined inside a different package?

Main.java,主包:

package pkgs.main;
import pkgs.test.B;

// Just some method inside the "main class"
void method() {
    B b = new B();
    b.x ++;  //   <--- why is this allowed?
}

A.java,主要包:

package pkgs.main;

public class A {
    protected int x;
}

B.java,測試包:

package pkgs.test;
import pkgs.main.A;

public class B extends A {
}

編輯:

解決此問題的另一種方法如下。 我將在現有示例代碼中添加兩行額外的代碼:

Main.java,主包:

// Just some method inside the "main class"
void method() {
    B b = new B();
    b.x ++;  //   <--- why is this allowed?

    b.y ++;  //   (Additional code) Compilation ERROR, which is correct.
}

B.java,測試包:

public class B extends A {
    protected int y;  // (Additional code)  protected field;
                      // access to it is disallowed inside the 
                      // "main calling class" above.
}

由於B擴展了A,因此受保護的字段也允許訪問其子級。

protected修飾符指定成員只能在其自己的程序包中(與package-private一起)訪問,並且只能由其在另一個程序包中的類的子類訪問。

請更喜歡閱讀Controlling Access to Members of a Class

Modifier    Class   Package Subclass    World
---------------------------------------------

protected   Y      Y        **Y**           N

也許您誤解了“受保護”的概念。

protected修飾符指定成員只能在其自己的包中訪問(與package-private一樣),並且只能由其在另一個包中的類的子類訪問

資源

在此特定示例情況下,允許“直接訪問”對象的受保護字段,因為受保護字段聲明是在與“調用代碼”位於同一包內的類中進行的。 我猜Java不會看到實際在哪個包中使用該字段(即通過繼承在另一個包中)。 Java只對最初聲明該字段的位置感興趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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