[英]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
在此特定示例情況下,允許“直接訪問”對象的受保護字段,因為受保護字段聲明是在與“調用代碼”位於同一包內的類中進行的。 我猜Java不會看到實際在哪個包中使用該字段(即通過繼承在另一個包中)。 Java只對最初聲明該字段的位置感興趣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.