You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:48:44