我在package1中有一个名为A的类,在package2中有一个名为C的类.C类扩展了A类.
A有一个实例变量,声明如下:
protected int protectedInt = 1;
Run Code Online (Sandbox Code Playgroud)
这是A类的代码
package package1;
public class A {
public int publicInt = 1;
private int privateInt = 1;
int defaultInt = 1;
protected int protectedInt = 1;
}
Run Code Online (Sandbox Code Playgroud)
这是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);
}
}
Run Code Online (Sandbox Code Playgroud)
Eclipse强调了C.go()中的最后一行,并说"A.protectedInt"不可见.这似乎与oracle文档中给出的"protected"关键字的定义冲突.
protected修饰符指定只能在其自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问该成员.
这里发生了什么?
我是Java语法的新手,正在研究有关受保护访问修饰符的问题.标题为"受保护的成员从java中的不同包访问 - 一种好奇心".
在该问题中,提到了以下代码:
package packageOne;
public class Base{
protected void display(){
system.out.println("in Base");
}
}
package packageTwo;
public class Derived extends packageOne.Base{
public void show(){
new Base().display();//this is not working throws compilation error that
//display() from the type Base is not visible
new Derived().display();//is working
display();//is working
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是关于最后一行代码.
display(); //is working
Run Code Online (Sandbox Code Playgroud)
对我来说,这行不编译,这是有道理的,因为该方法是从静态上下文中引用的.
我理解了使用受保护成员和引用变量类型的规则,但使用没有引用变量的非静态受保护成员似乎让我感到困惑.
阅读答案,我没有看到其他人有这个问题,除了最后的答案.但这个答案似乎与提出的问题无关.
对不起,这个问题可能看起来很迂腐或原始,但它打扰了我,因为这打破了OO编程.
我在这里错过了什么吗?请指教,
谢谢