protected修饰符访问权限疑问:非子类为何可访问?
关于protected修饰符的访问权限解惑
嘿,这个问题真的是入门阶段很容易踩的坑,我当初学的时候也懵过!咱们把这个规则掰碎了说清楚~
首先纠正一个常见的认知误区:protected成员不止能被子类访问,它的可见性其实有三个范围:
- 定义该成员的类本身
- 同一个包内的所有类(哪怕没有继承关系)
- 所有继承了该类的子类(不管子类和父类是不是在同一个包)
你在项目里遇到的“未继承类A的类B能访问A的protected实例变量”,大概率就是因为类A和类B在同一个包下面!这是很多初学者容易忽略的规则,Java(以及很多类似的面向对象语言)里的protected权限默认包含同包访问。
给你举个直观的代码例子:
假设我们有个包com.demo:
// 类A,定义protected变量 package com.demo; public class A { protected int protectedVar = 20; } // 类B,和A同包但不继承 package com.demo; public class B { public void accessProtected() { A aInstance = new A(); System.out.println(aInstance.protectedVar); // 完全可以正常访问! } }
但如果把类B放到另一个包,且不继承A,就会直接编译报错:
// 类B在不同包,且无继承 package com.other; import com.demo.A; public class B { public void accessProtected() { A aInstance = new A(); System.out.println(aInstance.protectedVar); // 这里会提示权限不足,编译失败 } }
再补充子类的情况:哪怕子类在不同包,只要继承了A,就能访问A的protected成员(通常是通过子类实例或者super关键字访问):
// 子类C在不同包 package com.other; import com.demo.A; public class C extends A { public void accessParentProtected() { System.out.println(super.protectedVar); // 可以通过super访问 System.out.println(this.protectedVar); // 也可以通过子类实例访问 } }
总结一下,protected的权限范围比很多人想的要宽一点,同包访问这个点一定要记牢,下次遇到类似情况先检查一下包结构就清楚啦~
内容的提问来源于stack exchange,提问作者Faisal
相关产品推荐
相关产品推荐

