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
相关产品推荐
相关产品推荐

