我对继承力的工作方式非常不清楚,只是想确保我朝着正确的方向前进。
据我了解
我知道子类可以看到父类的受保护变量。
我的问题:它可以反过来起作用吗?
答案 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)
答案 3 :(得分:-3)
它是否反过来起作用?
否,除非它们位于同一包装中