父类可以看到子类受保护的变量吗?

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】:

反之亦然吗?

没有,除非它们在同一个包中

【讨论】:

以上是关于父类可以看到子类受保护的变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

子类从 Java 中的父类更改受保护的变量

我可以在父类中有一个“受保护”成员并在子类中继承它吗?

子类公有继承不能访问父类受保护属性? cannot access protected member

我可以在 Java 中公开受保护的成员吗?我想从子类访问它

Java - 子类中的受保护变量是啥类型?

子类真的继承私有成员变量吗?