Eclipse中子类使用Protected访问修饰符遇意外编译错误
理清Java Protected访问修饰符的误区
嘿,你遇到的问题其实是对protected修饰符的访问范围理解有个小偏差,我来给你掰扯清楚~
首先先纠正一个认知:protected成员在不同包的子类中,并不是能直接通过父类的实例访问的,它的访问规则其实是这样的:
- 同包下的所有类可以随意访问
- 不同包的子类,只能通过**子类自身的实例(或者子类的子类实例)**来访问继承自父类的protected成员,而不能直接用父类的实例跨包访问
看你写的代码,在ProtectedAccessSpecifierRnD2里直接创建了父类ProtectedAccessSpecifierRnD的对象obj,然后尝试访问obj.protectedIntVar,这就违反了上面的规则,所以编译器报错了。
修复后的代码示例
你可以改成用子类的实例来访问这些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) { // 创建子类的实例,而不是父类的 ProtectedAccessSpecifierRnD2 childObj = new ProtectedAccessSpecifierRnD2(); // 现在可以正常访问继承来的protected成员了 System.out.println(childObj.protectedIntVar+" "+childObj.protectedStrVar); } }
或者如果是在子类的非静态方法里,还可以用this来访问:
public class ProtectedAccessSpecifierRnD2 extends ProtectedAccessSpecifierRnD{ public void accessProtectedMembers(){ // 非静态方法中用this访问继承的protected成员 System.out.println(this.protectedIntVar+" "+this.protectedStrVar); } public static void main(String[] args) { new ProtectedAccessSpecifierRnD2().accessProtectedMembers(); } }
为什么原来的代码不行?
简单来说,protected成员的“可见性”在跨包子类中,是作为子类继承得到的成员存在的,而不是父类本身的成员对外暴露给子类访问。所以你只能通过子类的实例来访问这些继承来的属性,而不能直接操作父类的实例去访问它的protected成员(跨包情况下)。
Eclipse的提示可能有点模糊,但本质问题就是代码不符合Java的访问控制规则,和IDE本身没什么关系哦~
内容的提问来源于stack exchange,提问作者Sharad Nanda
相关产品推荐
相关产品推荐

