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

Java中protected成员是否可被同包非子类访问?

嘿,这个问题问得特别好!你之前的认知其实只覆盖了protected权限的一部分,那些网站的说法完全正确。

关于Java中protected成员的访问权限细节

protected的访问范围其实包含两个关键场景,很多人容易漏掉第一个:

  • 同包内的所有类(不管是不是子类):在同一个包结构下,哪怕某个类和拥有protected成员的类没有继承关系,也能直接访问该成员——这是Java访问权限规则里明确规定的,目的是方便包内的代码协作。
  • 不同包中的子类:这部分是你原本了解到的,子类可以通过继承关系访问父类的protected成员,但要注意:不同包的子类只能通过自身实例或者super关键字来访问,不能直接通过父类的实例去调用该成员。

给你举两个简单的代码例子,一看就懂:

示例1:同包非子类访问protected成员

假设我们在com.demo包下有两个类:

// com.demo.Parent.java
public class Parent {
    protected String userName = "JohnDoe";
}

// com.demo.NonSubClass.java
public class NonSubClass {
    public void printName() {
        Parent parent = new Parent();
        System.out.println(parent.userName); // 完全合法,因为同包
    }
}

示例2:不同包子类的访问限制

如果子类和父类不在同一个包:

// com.other.SubClass.java
public class SubClass extends Parent {
    public void testAccess() {
        System.out.println(this.userName); // 合法,子类自身实例访问
        System.out.println(super.userName); // 合法,通过super访问父类成员
        
        Parent externalParent = new Parent();
        // System.out.println(externalParent.userName); // 编译报错!不同包非子类实例无权访问
    }
}

简单总结:protected权限是为了平衡包内代码的便捷协作和跨包的继承扩展,所以同包非子类能访问是完全符合规则的,并不是错误说法哦。

内容的提问来源于stack exchange,提问作者Al Masud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:00:34