了解java的受保护的修饰符
我在package1中有一个名为A的类,而在package2中有一个名为C的类。 C类扩展了A类。
A有一个实例变量,声明如下:
protected int protectedInt = 1;
这是A类的代码
package package1;
public class A {
public int publicInt = 1;
private int privateInt = 1;
int defaultInt = 1;
protected int protectedInt = 1;
}
这里是C类的代码:
package package2;
import package1.A;
public class C extends A{
public void go(){
//remember the import statement
A a = new A();
System.out.println(a.publicInt);
System.out.println(a.protectedInt);
}
}
Eclipse强调了C.go()中的最后一行,并说“A.protectedInt”不可见。 看来这与oracle文档中给出的“protected”关键字的定义相冲突。
受保护的修饰符指定该成员只能在其自己的包内访问(与包私有一样),另外,还可以在另一个包中访问该类的子类。
这里发生了什么?
这里发生了什么?
你误解了protected
的含义。 您可以访问受保护的成员宣布A
从内C
,但只为实例C
或子类C
。 有关受保护访问的详细信息,请参阅JLS的第6.6.2节。 尤其是:
设C是声明受保护成员的类。 仅在C的子类S的主体内才允许访问。
另外,如果Id表示实例字段或实例方法,则:
[...]
如果通过字段访问表达式E.Id(其中E是主表达式)或通过方法调用表达式E.Id(...)(其中E是主表达式)访问,则只有当且仅当如果E的类型是S或S的一个子类 。
(强调我的。)
所以这段代码会很好:
C c = new C();
System.out.println(c.publicInt);
System.out.println(c.protectedInt);
由于C
继承了A
,因此C
可以直接使用下面的A
的protected
变量
public class C extends A{
public void go(){
System.out.println(protectedInt);
}
}
根据你的代码,你正在创建一个A
的实例并通过该实例访问protected
变量,这违反了Java的规则 - 一个受保护的变量在包之外是不可见的
public void go(){
//remember the import statement
A a = new A();
System.out.println(a.publicInt);
System.out.println(a.protectedInt);
}
当你在做A a = new A();
和a.protectedInt
你试图访问A的保护成员是非法的,根据Java标准
相反,您可以直接执行this.protectedInt
。