// This package and class are in ProtectedAccessSpecifierRnD.java file
package com.j2se.access_specifiers;
public class ProtectedAccessSpecifierRnD {
protected int protectedIntVar;
protected String protectedStrVar;
}
我创建另一个文件,在其中扩展此类以研究 protected 访问说明符属性,如下所示:-
//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);
}
}
现在,据我所知,类的 protected 成员(实例变量和方法)对于相同的包类以及继承上述类的其他包类都是可见的。
奇怪的是,Eclipse 要求我将 protected 关键字添加到已 protected 变量中。请也在这里查看屏幕截图 ScreenShot
我已经清理并重建了项目,并重新启动了 Eclipse。
如果有人能够弥补我在 java/eclipse/oops 方面的知识差距,无论我在这里缺乏什么,我将不胜感激。提前致谢。
最佳答案
编译错误是正确的,我认为你只是错过了一点!
protected
访问修饰符意味着
如果一个类定义如下:
package com.j2se.access_specifiers; public class ProtectedAccessSpecifierRnD { protected int protectedIntVar; protected String protectedStrVar; }
同一包中的所有类都可以通过其对象显式访问 protected
字段,而无需任何 setter 或 getter 方法。
其他包中的所有子类都可以在其代码中访问父类的
protected
字段,例如在其方法或构造函数中:public class ProtectedAccessSpecifierRnD2 extends ProtectedAccessSpecifierRnD{ public ProtectedAccessSpecifierRnD2() { protectedIntVar = 0; protectedStrVar = "Test"; } }
但是在您的代码中,您正在子类的代码中从父类创建一个对象,这从一开始就不应该起作用。
简而言之:
如果任何对象是从父类创建的,则只有同一包中的类可以通过其对象变量显式访问它。在其他包中,只有子类可以在其方法或构造函数中显式访问父类的那些 protected 字段。
由于ProtectedAccessSpecifierRnD2
扩展了ProtectedAccessSpecifierRnD
,它将继承ProtectedAccessSpecifierRnD
的非私有(private)和非默认(没有任何修饰符)字段。然后您可以说 ProtectedAccessSpecifierRnD2
有 protectedIntVar
和 protectedStrVar
字段作为自己的字段,因此很明显您可以通过 ProtectedAccessSpecifierRnD2
中的对象访问它们,因为这些字段也是 ProtectedAccessSpecifierRnD2
的字段:
ProtectedAccessSpecifierRnD2 obj = new ProtectedAccessSpecifierRnD2();
System.out.println( obj.protectedIntVar + " " + obj.protectedStrVar );
希望这有帮助。
关于java - protected 访问说明符在 Eclipse 中的子类中给出意外的编译时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50342689/