我正在阅读Sybex 完整 Java 2 认证学习指南 2005 年 4 月(ISBN0782144195)。本书适合想要通过java认证的java开发人员。
在了解访问修饰符(以及其他修饰符)一章之后,我发现了以下问题(#17):
对或错:如果 Y 类扩展
X班,两个班在
不同的包,并且 X 类有一个
受保护的方法称为 abby(),然后
Y 的任何实例都可以调用 abby()
Y 的任何其他实例的方法。
这个问题让我有点困惑。
据我所知,您可以在同一类(或子类)的任何变量上调用受保护的方法。您不能在层次结构中比您更高的变量上调用它(例如您实现的接口)。
例如,您不能仅仅因为继承了任何对象而克隆它。
但这些问题没有提到变量类型,只提到实例类型。
我有点困惑,回答“是”。
书上的答案是
错误的。从不同包中的超类继承受保护方法的对象可以在其自身上调用该方法,但不能在同一类的其他实例上调用该方法。
这里没有关于变量类型的内容,只有关于实例类型的内容。
这很奇怪,我不明白。
有人能解释一下这是怎么回事吗?
对或错:如果类 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();
}
}
It isY 可以调用 Y 任何实例的 abby() 方法它有一个参考. 所以书上的答案是明显错误的。Java 没有特定于实例的作用域(与具有实例私有作用域的 Scala 不同)。
如果我们试着仁慈一点,也许这个问题的意思是“anyY 的其他实例”,它可以访问以下方法恰好在内存中的 Y 的任何实例- 这是不可能的,因为 Java 没有直接内存访问。但在这种情况下,这个问题的措辞非常糟糕,您甚至可以回答:“错误。您不能在不同 JVM 上的实例、已被垃圾收集的实例或已死亡的 JVM 上的实例上调用方法。”一年前等等。”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)