// This package and class are in ProtectedAccessSpecifierRnD.java file
package com.j2se.access_specifiers;
public class ProtectedAccessSpecifierRnD {
protected int protectedIntVar;
protected String protectedStrVar;
}
我创建了另一个文件,我在这里扩展了这个类,用于研究受保护的访问说明符属性,如下所示: -
//This package and class are in ProtectedAccessSpecifierRnD2.java file
package com.j2se.access_specifiers_2;
import com.j2se.access_specifiers.ProtectedAccessSpecifierRnD;
public class ProtectedAccessSpecifierRnD2 extends ProtectedAccessSpecifierRnD{
public static void main(String[] args) {
ProtectedAccessSpecifierRnD obj = new ProtectedAccessSpecifierRnD();
/* Here on below line compile time error comes "The field ProtectedAccessSpecifierRnD.protectedStrVar & ProtectedAccessSpecifierRnD.protectedIntVar are not visible"*/
System.out.println(obj.protectedIntVar+" "+obj.protectedStrVar);
}
}
现在,据我所知,类的受保护成员(实例变量和方法)对于相同的包类以及继承上述类的其他包类是可见的。
奇怪的是,Eclipse要求我将protected关键字添加到已经受保护的变量中。请在此处查看屏幕截图ScreenShot
我已经清理过& amp;重建了这个项目,并重新启动了日食。
如果有人能够弥补我对java / eclipse / oops的了解,我将不胜感激,无论我在这里缺少什么。提前谢谢。
答案 0 :(得分:0)
编译错误是正确的,我认为你只是错过了一点!
protected
访问修饰符表示
如果类定义如下:
package com.j2se.access_specifiers;
public class ProtectedAccessSpecifierRnD {
protected int protectedIntVar;
protected String protectedStrVar;
}
同一个软件包中的所有类都可以通过其对象显式访问protected
字段,而无需任何setter或getter方法。
其他软件包中的所有子类都可以在其代码中访问 parent 类的protected
个字段,例如在他们的方法或构造函数中:
public class ProtectedAccessSpecifierRnD2 extends ProtectedAccessSpecifierRnD{
public ProtectedAccessSpecifierRnD2() {
protectedIntVar = 0;
protectedStrVar = "Test";
}
}
但是在你的代码中,你是在子类的代码中从父类创建一个对象,这不应该从头开始工作。
简而言之:
如果从父类创建任何对象,则只有同一个包中的类可以通过其对象变量显式访问它。在其他包中,只有子类可以在其方法或构造函数中显式访问父类的protected
个字段。
自ProtectedAccessSpecifierRnD2
扩展ProtectedAccessSpecifierRnD
以来,它将继承ProtectedAccessSpecifierRnD
的非私有和非默认(不带任何修饰符)字段}。然后,您可以说ProtectedAccessSpecifierRnD2
已将protectedIntVar
和protectedStrVar
字段作为自己的字段,因此很明显您可以通过ProtectedAccessSpecifierRnD2
中的对象访问它们,因为这些字段是ProtectedAccessSpecifierRnD2
也是:
ProtectedAccessSpecifierRnD2 obj = new ProtectedAccessSpecifierRnD2();
System.out.println( obj.protectedIntVar + " " + obj.protectedStrVar );
希望这有帮助。
答案 1 :(得分:0)
ProtectedAccessSpecifierRnD2 obj = new ProtectedAccessSpecifierRnD2();
System.out.println(obj.protectedIntVar+" "+obj.protectedStrVar);
这应该有效