You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动