为何无法访问父类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
相关产品推荐
相关产品推荐

