【问题标题】:What does the protected modifier mean?受保护的修饰符是什么意思?
【发布时间】:2012-01-28 02:18:11
【问题描述】:

我正在看书The Java Programming Language, 3rd edition

在第 3.5 章中,它用以下文字说明了 protected 修饰符:

更准确地说,除了可以在类本身中访问之外,还可以在 同一个包,受保护的成员也可以通过对象引用从类中访问 至少与类的类型相同,即类的类型的引用或 一种它的子类型。

这句话让我感到困惑,在两个方面:

1. 受保护的成员可以被同一个包中的代码访问吗?我之前知道的是protected成员只能被子类访问...

2.我不明白a protected member can also be accessed from ...是什么意思,谁能给我解释一下?

【问题讨论】:

标签: java protected access-modifiers


【解决方案1】:
  1. 是的,protected 成员可以从类本身、类的子类以及该类的同一个包中的所有类访问(不管它们是否是子类)。如果您之前不知道最后一部分,那么您刚刚学到了一些新东西。

  2. 这只是意味着您可以使用这些成员;如果某个成员不可访问,则意味着您在尝试使用它时会遇到编译器错误。

【讨论】:

  • 对于第二条语句:当 protected int status; 最初声明并稍后访问它时,它不会抛出错误。因为它的默认值自动设置为 0。因此,status 在不可访问时将始终为 0
  • @JanakaRRajapaksha 成员变量的默认值与可访问性无关。
  • 假设我从一开始就声明了它。并尝试从无法访问的类(x)或方法(x)访问它。由于它不可访问,因此从可访问的位置输出时将具有默认值。现在根据你的第二个陈述,我期待一个错误,但它没有。它只是给出 0 作为它的默认值。这样“x”中的代码就没用了。
  • 同一个包中的兄弟类可以通过引用访问彼此受保护的成员。例如扩展 org.my.Base 类的 org.my.Derived1 和 org.my.Derived2 可以通过其他类型的引用访问彼此受保护的成员。但是,也扩展 org.my.Base 的 com.another.Derived3 不能从 Derived1 或 Derived2 访问其受保护的成员,除非将 Derived3 强制转换为 com.my.Base。 C# 不允许这样做,请参阅docs.microsoft.com/en-us/archive/blogs/ericlippert/…
【解决方案2】:

在 Java 中,protected 表示该成员可以被同一个包中的任何类和子类访问,即使它们位于另一个包中。

注意

A protected variable is not visible outside the package

例如 B 扩展了 A 并且 A 有一个受保护的 int x;它可以在 B 类中使用。但不能使用其实例变量访问

【讨论】:

    【解决方案3】:

    1) 是的,受保护的成员可以被同一个包中的类访问。这就是 Java 的工作方式。

    2) 这意味着子类可以访问它们。

    【讨论】:

      【解决方案4】:

      我不明白受保护的成员也可以从什么访问...意思是,任何人都可以向我解释一下吗?

      例如,您有一个对象 A 和一个对象 B,它们都属于同一个类。如果对象 A 有对它的引用,则对象 A 将能够查询对象 B 的受保护属性和方法。 protected 修饰符在类级别而不是对象级别强制执行。这在某些情况下会派上用场。

      【讨论】:

        【解决方案5】:

        这里有答案

        1. 是的。一个类的受保护成员(实例变量和方法)可以被同一个包中的其他类以及任何其他扩展这个包含要访问的成员的类的类访问。在同一规范中,他们还给出了访问级别严格增加的表,提供了前面级别中允许的所有访问:private -> package -> protected -> public

        2. 由于类 X 的受保护成员(实例变量/状态和方法/行为)作为 X 的子类的一部分被继承和可见,例如 Y1、Y2、Y3,并且可能进一步向下级别,任何 X 或 Y1、Y2、y3 类型的对象引用都可用于访问该受保护成员。

        【讨论】:

          【解决方案6】:

          只需将其视为介于公共和私人之间。您可以从公共课程中访问所有内容,而从私人课程中访问更少。

          【讨论】:

            猜你喜欢
            • 2012-05-14
            • 2014-05-16
            • 2016-12-11
            • 1970-01-01
            • 1970-01-01
            • 2015-06-28
            • 2010-10-27
            • 2016-02-12
            • 2013-03-05
            相关资源
            最近更新 更多