无法从不同包中定义的子 class 访问 class 的受保护成员

Can't access protected members of a class from a subclass defined in a different package

我正在学习 Java 使用这本书 Java:完整参考。我目前在第 9 章,因此刚刚介绍了包。在第 187 页上,它显示 "If you want to allow an element to be seen outside your current package, but only to classes that subclass your class directly, then declare that element protected "。我从中了解到,一个子 class 驻留在一个包中,比如 'B',并在另一个包 [=22] 中扩展一个定义为 public 的 class =],有一个名为 "proc" 的成员,然后为了使 proc 在所有子 class 中可用,包括在当前包 'A' 之外定义的子 class,我必须将其标记为受保护。现在看看我在包 'B':

中定义的 subclass 的实现
package subapp;
import app.*;

public class Test extends App {

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

我确定所有包(在 class 文件中)都已正确加载,"direct" Test 的 superclass 及其非参数化构造函数 publicly accessible,proc被标记为protected,main()函数在那里没有问题。但是当 运行 subapp.Test 说“proc 在 /superclass 路径 / 中受保护访问时,我得到一个运行时异常。我是把书的陈述弄错了还是陈述本身错了?

您已经在扩展 App,因此您不想在构造函数中创建新的 App。相反,如果变量是 protected.

,请尝试这样的事情
public Test() {
   System.out.println(this.proc);
}

它现在对你不起作用的原因是你正在构造函数中创建一个新的 App,然后试图访问那个 Appproc 值直接,而不是通过继承。

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

public App() {
   proc = "test";
}

//.....

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