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

new*_*b24 0 java class protected object instance-variables

我对继承如何运作非常模糊,只是想确保我正在朝着正确的方向前进.

根据我的理解,我理解这一点

  1. 所有包都可以访问公共变量,
  2. 单个包内的默认值,
  3. 私人只在课堂上,
  4. 并用子类保护.

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

我的问题:它是否相反?

T.J*_*der 6

它是否相反?

不,如果他们不在同一个包装中,请不要.根据Java访问控制教程中的表,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    |
+??????????????????????????????????????????????+

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); // 
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试编译失败的原因是:

./b/Base.java:7: error: answer has protected access in Example
        System.out.println(e.answer); // 
                            ^
1 error