我正在使用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语句错误或语句本身错了?
答案 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