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

时间:2018-07-24 08:58:18

标签: java class object instance-variables protected

我对继承力的工作方式非常不清楚,只是想确保我朝着正确的方向前进。

据我了解

  1. 所有程序包都可以访问
  2. 公共变量,
  3. 单个软件包中的
  4. 默认
  5. 仅在班级内私人,
  6. 并受子类保护。

我知道子类可以看到父类的受保护变量。

我的问题:它可以反过来起作用吗?

4 个答案:

答案 0 :(得分:6)

  

它是否反过来起作用?

否,如果它们不在同一包装中,则不会。根据{{​​3}}中的表,protected将成员暴露给同一包中的子类和其他类,而不是超类:

                  Access Levels
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
| Modifier     Class  Package  Subclass  World |
| public         Y       Y        Y       Y    |
| protected      Y       Y        Y       N    |
| no modifier    Y       Y        N       N    |
| private        Y       N        N       N    |
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+

并且来自Java access control tutorial

  

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 error

答案 1 :(得分:0)

如果您考虑一下,您的要求并没有太大的意义。考虑一下:

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();

答案 2 :(得分:0)

enter image description here

如您所见,可能来自子类而不是超类

您可以阅读官方文档   here

答案 3 :(得分:-3)

它是否反过来起作用?

否,除非它们位于同一包装中