我有这些课程:
package abc;
public class A {
public int publicInt;
private int privateInt;
protected int protectedInt;
int defaultInt;
public void test() {
publicInt = 0;
privateInt = 0;
protectedInt = 0;
defaultInt = 0;
}
}
“A”包含所有四个访问修饰符的属性。这些其他类扩展“A”或创建实例并尝试访问属性。
package de;
public class D {
public void test() {
E e = new E();
e.publicInt = 0;
e.privateInt = 0; // error, cannot access
e.protectedInt = 0; // error, cannot access
e.defaultInt = 0; // error, cannot access
}
}
package de;
import abc.A;
public class E extends A {
public void test() {
publicInt = 0;
privateInt = 0; // error, cannot access
protectedInt = 0; // ok
defaultInt = 0; // error, cannot access
}
}
package abc;
import de.E;
public class C {
public void test() {
E e = new E();
e.publicInt = 0;
e.privateInt = 0; // error, cannot access
e.protectedInt = 0; // ok, but why?
e.defaultInt = 0; // error, cannot access
}
}
一切都很好,除了我不明白,为什么在C级,我可以访问e.protectedInt。
答案 0 :(得分:1)
由于C
与A
(包abc
)位于同一个包中,因此Java中的protected
修饰符包含同一包中的访问权限。
答案 1 :(得分:1)
我认为代码插图有助于更好地理解。
在E类中添加受保护的成员
public class E extends A {
protected int protectedIntE;
...
现在,尝试在C类中访问它
e.protectedInt = 0; // ok, but why?
e.protectedIntE = 0; // error, exactly as you expected
所以,这里要注意的是,虽然你通过protectedInt
的实例访问E
它实际上属于A类,并且只是通过继承由E类继承。 E类的实际(非继承)受保护成员仍然无法像您预期的那样访问。
现在,由于A类和C类在同一个包中,受保护的访问基本上可以作为包的超集(通过包括子类访问),编译器也没有什么可抱怨的。
答案 2 :(得分:0)