帮助理解受保护方法的问题

zer*_*oed 9 java protected certificate access-modifiers

我正在阅读Sybex Complete Java 2认证学习指南2005年4月(ISBN0782144195).本书适用于想要通过java认证的java开发人员.

在关于访问修饰符(以及其他修饰符)的章节之后,我发现了以下问题(#17):

对或错:如果类Y扩展了类X,那么这两个类在不同的包中,并且类X有一个名为abby()的受保护方法,那么Y的任何实例都可以调用Y的任何其他实例的abby()方法.

这个问题让我有点困惑.

据我所知,你可以在同一个类(或子类)的任何变量上调用protected方法.您不能在变量上调用它,层次结构中的变量比您更高(例如,您实现的接口).

例如,您不能仅仅因为继承它而克隆任何对象.

但问题没有提到变量类型,只涉及实例类型.

我有点困惑,回答"真实".

书中的答案是

假.从不同包中的超类继承受保护方法的对象可以在自身上调用该方法,但不能在同一类的其他实例上调用该方法.

这里没有关于变量类型的内容,只有实例类型.

这很奇怪,我不明白.

谁能解释一下这里发生了什么?

Esk*_*ola 2

对或错:如果类 Y 扩展类 X,这两个类位于不同的包中,并且类 X 有一个名为 abby() 的受保护方法,则 Y 的任何实例都可以调用 Y 的任何其他实例的 abby() 方法。

“错误。从不同包中的超类继承受保护方法的对象可以在其自身上调用该方法,但不能在同一类的其他实例上调用该方法”。

让我们像BalusC那样写下来,并向 Y 添加一个调用 Y 任何其他实例的 abby() 的方法:

package one;
public class X {
    protected void abby() {
    }
}

package other;
import one.X;
public class Y extends X {
    public void callAbbyOf(Y anyOther) {
        anyOther.abby();
    }
}
Run Code Online (Sandbox Code Playgroud)

Y可以调用它所引用的任何 Y 实例的 abby() 方法。所以书上的答案是明显错误的。Java 没有特定于实例的作用域(与具有实例私有作用域的 Scala 不同)。

如果我们试着仁慈一点,也许问题的意思是“ Y的任何其他实例”,它是否可以访问恰好位于内存中的Y的任何实例的方法——这是不可能的,因为Java没有直接内存使用权。但在这种情况下,这个问题的措辞非常糟糕,您甚至可以回答:“错误。您不能在不同 JVM 上的实例、已被垃圾收集的实例或已死亡的 JVM 上的实例上调用方法。”一年前等等。”