无法从另一个包中定义的子类访问类的受保护成员

时间:2016-06-01 17:25:19

标签: java package protected access-specifier

我正在使用Java:The Complete Reference这本书学习Java。我目前在第9章,因此只是生成包。在页187,它说“如果你想允许在当前包之外看到一个元素,但只允许在直接子类化类的类中,那么声明该元素受保护”。我从中理解的是,一个子类驻留在一个包中,说'B',并在另一个包'A'中扩展一个被定义为public的类,有一个名为“proc”的成员,然后为了生成proc在所有子类中都可用,包括在当前包'A'之外定义的子类,我必须将其标记为受保护。现在看看我在包'B'中定义的子类的实现:

package subapp;
import app.*;

public class Test extends App {

  public Test() { 
      App app = new App();
      System.out.println(app.proc); // error
   }
}

我确信所有的包(在两个类文件中)都正确加载,“直接”的超级类Test和它的非参数化构造函数是公共可访问的,proc被标记为protected,而main()函数那里没有问题。但是在运行subapp.Test时我得到了一个运行时异常,它说“proc在/ superclass path /中有访问权限。我是否将book语句错误或语句本身错了?

1 个答案:

答案 0 :(得分:1)

您已经在扩展App,因此您不希望在构造函数中创建新的App。相反,如果变量是protected,请尝试这样的事情。

public Test() {
   System.out.println(this.proc);
}

它现在不适合你的原因是你在构造函数中创建一个新的App,然后尝试直接访问App的{​​{1}}值,而不是通过继承。

如果此proc值不正确,您可能必须在proc之前设置它,或者如果{{1}您可以在打印值之前调用System.out.println(this.proc);构造函数正在初始化super();构造函数,例如:

proc
相关问题