父类可以看到子类受保护的变量吗?
Posted
技术标签:
【中文标题】父类可以看到子类受保护的变量吗?【英文标题】:Can the parent class see a child classes protected variables? 【发布时间】:2018-12-31 20:02:01 【问题描述】:我对继承的工作原理非常模糊,只是想确保我正在寻找正确的方向。
据我了解,
-
所有包都可以访问公共变量,
默认在单个包内,
仅在班级内私有,
并受子类保护。
我知道子类可以看到父类的受保护变量。
我的问题:反之亦然吗?
【问题讨论】:
运行一个示例代码块并找出:) @notyou - 很容易出错,遇到编译器错误等。 请创建问题的MVCE,以便其他人可以最好地帮助您。 【参考方案1】:反之亦然吗?
不,如果它们不在同一个包中,则不会。根据Java access control tutorial 中的表格,protected
将成员暴露给同一包中的子类和其他类,而不是超类:
访问级别 +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− |修饰符类包子类世界 | |公开 Y Y Y Y | | 受保护的 Y Y Y N | |没有修饰符 Y Y N N | |私人 Y N N N | +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
来自the JLS:
6.6.2。受保护访问的详细信息
一个对象的
protected
成员或构造函数可以从包外部访问,只有负责实现该对象的代码在该包中声明它。
超类不负责子类对象的实现。
你可以自己测试一下:
b/Base.java
:
package b;
import a.Example;
public class Base
public static void showAnswer(Example e)
System.out.println(e.answer); //
a/Example.java
:
package a;
import b.Base;
public class Example extends Base
protected int answer = 42;
public static void main(String[] args)
Example e = new Example();
Base.showAnswer(e);
尝试编译失败:
./b/Base.java:7: error: answer has protected access in Example System.out.println(e.answer); // ^ 1 个错误
【讨论】:
您提供的示例仍然使用子类。 @NiVeR - 不在访问answer
的代码中。无论如何,那个例子是有缺陷的,它们在同一个包中。我添加了一个示例,它们不在同一个包中,展示了错误。
简短的回答是“Base
不知道 Example
是他的孩子,所以这里适用标准的可访问性规则”【参考方案2】:
如果你仔细想想,你所问的并没有多大意义。考虑一下:
public class A
public void doSomething()
// This is not actually possible!!!
bField = 12;
public class B extends A
protected int bField;
public class C extends A
// ... whatever except bField...
...
A aInstance = new C();
// What should happen here? a C does not have a bField!!!
aInstance.doSomething();
【讨论】:
【参考方案3】:正如您从子类而不是超类中看到的那样
您可以阅读官方文档 here
【讨论】:
【参考方案4】:反之亦然吗?
没有,除非它们在同一个包中
【讨论】:
以上是关于父类可以看到子类受保护的变量吗?的主要内容,如果未能解决你的问题,请参考以下文章