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

为何无法访问父类protected成员却能访问子类protected成员?

关于Java中protected成员访问权限的困惑解答

这个问题其实是Java里protected权限最容易绕晕的点之一,我给你一步步理清楚~

首先得明确Java中protected访问权限的核心规则:

  • 同一个包内的所有类都能直接访问protected成员;
  • 不同包的子类可以访问,但有个关键限制:只能访问属于「自身继承体系向下延伸」的对象的protected成员,或者自身实例的。

先补全你场景里的Subchild类代码(默认它是Child的子类):

package com.company.childPack;
public class Subchild extends Child {}

为什么Child能访问subchild.x?

Subchild是Child的直接子类,属于Child继承体系向下延伸的分支(Parent → Child → Subchild)。对于Child来说,它作为Parent的子类,有权访问所有属于自己子类体系的对象从Parent继承来的protected成员,所以subchild.x完全合法,编译不会报错。

为什么反过来Subchild不能访问child.x?

如果我们在Subchild里写这样的代码:

package com.company.childPack;
public class Subchild extends Child {
    public int getValueSubchild(Child child) {
        return child.x; // 这里会编译报错!
    }
}

这时候就会报错,原因很简单:Child是Subchild的父类,child这个对象属于Subchild的上层继承体系,而不是向下延伸的子类分支。protected权限只允许子类访问自己的实例或者自己的子类实例的protected成员,不允许向上访问父类对象的protected成员。

简单来说:子类能“管”自己的孩子,但不能“管”自己的父母~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:35:46