【问题标题】:Why child class can use protected fields from class in other package? [duplicate]为什么子类可以使用其他包中类的受保护字段? [复制]
【发布时间】:2019-10-06 16:39:11
【问题描述】:

我使用 Boyarskiy OCA 认证书,第 173 页。

所以,我遇到了一些问题: 我在其他包中有父 class Birdprotected 字段名称和子。

package bird;

public class Bird{
    protected String name;
}

和孩子:

package swan;
import bird.Bird;

public class Swan extends Bird{
   public void check1(){
      System.out.print(name);
   }

   public void check2(){ 
      Swan swan = new Swan();
      System.out.print(swan.name);
   }

   public void check3(){
      Bird bird = new Bird();
      System.out.print(bird.name);
   }
}

所以, -check1编译ok

-check2 编译,但是为什么呢? check2() 是创建class 的新实例并尝试从其他包调用父字段名称(不是通过继承)。

-check3 无法编译。

【问题讨论】:

  • Jeanne Boyarsky 写了几本书。请张贴您正在使用的人的名称。
  • 我认为 JLS 会提供答案。顺便说一句,只是一个挑剔但没有任何东西试图“调用父字段名称” - 它试图访问该字段。不能调用字段,只能调用方法。我之所以提到这一点,是因为您提到了认证,如果您要参加认证测试,了解正确的术语很重要。
  • @Abra Oracle 认证 OCA java 8

标签: java


【解决方案1】:

该主题在 Java 语言规范第 6.6.2 章中处理: https://docs.oracle.com/javase/specs/jls/se12/html/jls-6.html#jls-6.6.2.1

里面的例子是,C 类(在你的例子中是鸟)有一个受保护的成员,而 S(在你的例子中是天鹅)是 C 的子类。

"如果访问是通过 (i) ExpressionName.Id 或 TypeName.Id 形式的限定名称,或 (ii) Primary.Id 形式的字段访问表达式,则允许访问实例字段 Id当且仅当限定类型是 S 或 S 的子类。"

您的函数 check2 符合此定义,因为您有 swan.name 并且 swan 的类型为“S”(如果我们保留标准的名称 C / S)。

所以 check3 必须失败,因为限定类型不是 S(在您的示例中为 Swan)或 S 的子类(它是 C 类型 - “鸟” - 在这个使用的场景中)。

【讨论】:

  • 如果Swan 中的方法不能完全访问任何其他Swan 实例中的所有字段,则您无法实现equals(例如return this.name.equals(otherSwan.name))。
  • 我还忘了提及:JLS 还引用了:“有关访问受保护成员的更多信息,请参阅 Alessandro Coglio 的 Checking Access to Protected Members in the Java Virtual Machine, in the Journal of Object技术,2005 年 10 月。”如果我没有错过任何内容,我会在jot.fm/issues/issue_2005_10/article3.pdf 上通过 Google 获得。也许有些人更喜欢阅读这样的文章而不是 JLS。
【解决方案2】:

protected 是一种表达方式对外界来说是私人的,对孩子来说是公共的。一个家庭拥有世界不应该知道的秘密的方式。这就是 check1check2 编译的原因,因为孩子可以访问。但是,对于 check3,您正在尝试访问只有孩子/家庭成员才能访问的内容,因此您不被允许。

OOP 和访问控制的更多细节在官方文档中:https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 1970-01-01
    • 2015-09-05
    • 2015-03-05
    • 2021-01-21
    • 2018-02-11
    • 2011-06-22
    • 2015-05-09
    相关资源
    最近更新 更多