【问题标题】:Can't access protected members of a class from a subclass defined in a different package [duplicate]无法从不同包中定义的子类访问类的受保护成员[重复]
【发布时间】:2016-10-01 04:55:44
【问题描述】:

我正在使用 Java: The Complete Reference 一书学习 Java。我目前在第 9 章,因此只是介绍了包。在第 187 页,它说 “如果您想允许在当前包之外看到元素,但只能看到直接子类化您的类的类,则声明该元素受保护 ”。我从中了解到的是,一个位于包中的子类,比如说'B',并扩展了一个在另一个包'A'中定义为公共的类,有一个名为“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 被标记为受保护,并且 main() 函数那里没有问题。但是在运行 subapp.Test 时出现运行时异常,提示“proc has protected access in /superclass path/。是我把 book 语句弄错了还是语句本身有误?

【问题讨论】:

  • Here 是一个很好的表格,说明了protected 访问修饰符的基础知识。

标签: java package protected access-specifier


【解决方案1】:

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

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

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

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

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

//.....

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

【讨论】:

  • 谢谢,有帮助。但是为什么我不能像在代码中那样使用受保护的成员呢?我仍然在“内部”测试(子类)对吗?
  • @Devashish 如果父构造函数正在初始化变量proc,您可以在构造函数中调用super();。如果是这种情况,请参阅我的编辑。但是它不适用于您现在拥有的代码的原因是因为即使您在Test(一个子类)中,您也试图在它的访问修饰符之外访问App 的值。 protected 值只能由子类访问,因此当您扩展 App 时,您可以直接访问所有 protectedpublic 变量/方法,而无需创建对象的新实例
  • 谢谢...现在很清楚了 :)
猜你喜欢
  • 2012-11-20
  • 2012-05-14
  • 2012-12-01
  • 2014-02-22
  • 2011-10-16
  • 1970-01-01
  • 2015-12-30
  • 2013-10-21
  • 2015-11-29
相关资源
最近更新 更多