Android Studio疑似Bug?子类无法访问父类protected成员
这大概率不是Android Studio的Bug,先从Java权限规则入手排查!
嘿,别着急甩锅给IDE呀,这种权限报错99%都是因为咱们没搞清楚Java中protected修饰符的访问规则,咱们来拆解下问题:
先明确protected的核心访问规则
protected成员的访问权限是有条件的:
- 同一包内的所有类都能直接访问;
- 子类(不管是否和父类同包)只能通过子类自己的实例或者
this关键字访问父类的protected成员,不能通过父类的实例去访问(除非子类和父类在同一个包)。
排查你的代码场景
结合你遇到的报错,大概率是出现了这种情况:
比如你在代码里用了父类Shape的引用去调用isOverlapMethodLevel,哪怕这个引用实际指向的是PlanetShape实例,只要不在同一个包,就会触发权限报错:
// 错误示例:父类引用调用protected方法(跨包场景下) Shape shapeInstance = new PlanetShape(); shapeInstance.isOverlapMethodLevel(); // 这里会提示protected权限问题
而如果换成子类实例调用,或者在PlanetShape内部用this调用,就完全没问题:
// 正确示例1:子类实例调用 PlanetShape planetInstance = new PlanetShape(); planetInstance.isOverlapMethodLevel(); // 正确示例2:子类内部用this调用 public class PlanetShape extends Shape { public void doSomething() { this.isOverlapMethodLevel(); // 合法访问 } }
极端情况:IDE缓存问题
如果上面的规则你都符合,但还是报错,那可以试试清理Android Studio的缓存:
- 点击顶部菜单栏的
File->Invalidate Caches... - 勾选
Clear file system cache and local history,然后点击Invalidate and Restart
补充下你提到的场景:
- PlanetShape类继承自Shape类(对应你提供的继承关系截图)
- 使用时提示
isOverlapMethodLevel在Shape中为protected访问权限(对应你提供的权限错误提示截图)
内容的提问来源于stack exchange,提问作者Shuang Li




