【问题标题】:Question test Java associate about Inheritance问题测试 Java associate 关于继承
【发布时间】:2022-11-30 22:46:20
【问题描述】:

我目前正在做一个 Java 测试,我发现了这个关于继承的问题:

以下关于双胞胎班级的哪些说法是正确的? (选择三个。)

package clone;
interface Alex {
  default void write() { System.out.print("1"); }
  static void publish() {}
  void think();
  private int process() { return 80; }
}

interface Michael {
  default void write() { System.out.print("2"); }
  static void publish() {}
  void think();
  private int study() { return 100; }
}

public class Twins implements Alex, Michael {
  void write() { System.out.print("3"); }
  static void publish() {}
  void think() {
  System.out.print("Thinking...");
   }
}

A. 由于 write() 方法,该类无法编译。
B. 由于 publish() 方法,该类无法编译。
C. 由于 think() 方法,该类无法编译。
D. Alex 接口中定义的所有方法都可以访问 > 在 Twins 类中。
E. Michael 接口中定义的所有方法都可以在 Twins 类中访问。
F. Twins 类不能被标记为抽象

回答:

  1. A、C、E。所有没有 private 修饰符的接口方法都是隐式公开的。在 但是,一个类,一个没有修饰符的方法默认是包私有的。为此原因, write() 和 think() 方法无法编译,因为它们缺少 public 修饰符,使选项A和C正确。这些是唯一的编译器错误,使 B选项错误。选项 D 不正确,因为 process() 方法不可访问 与双胞胎,因为它是私人的。选项E正确,因为所有方法都可以访问。 甚至可以通过调用在 Twins 类中访问被覆盖的默认方法 Michael.super.write()。最后,选项 F 是不正确的,因为如果 它被标记为抽象。

为什么选项字母E是正确的?我知道由于 study() 是私有的,因此无法在课堂外访问。

【问题讨论】:

  • 这些问题不适合 Stack Overflow。您应该阅读有关如何发布有意义的问题以及如何在 StackOverflow 上发布的指南
  • 恕我直言,答案 E 是错误的- 如果它不编译,它不运行,没有任何东西是可访问的
  • 只是一般说明:我们从不谈论“继承”,我们称之为“继承”。
  • @user16320675 好吧,当然可以调用默认方法和静态方法。您也可以调用隐式公共方法,但这只是因为类必须实现它们:P
  • @Maarten 如果整个代码不编译,ergo 不运行怎么办?

标签: java


【解决方案1】:

Java 接口中的任何方法都是隐式的public,参见JLS 17, section 9.4:

接口声明主体中的方法可以声明为公共或私有(第 6.6 节)。如果没有给出访问修饰符,则该方法是隐式公开的。允许在接口声明中为方法声明冗余指定 public 修饰符,但作为风格问题不鼓励。

由于您必须在您的类中实现抽象方法,因此您需要让公共方法对您自己可用。静态方法可以看作是在指定命名空间中可用的全局方法。不过,应该鼓励您写Michael.publish()。默认方法也是继承的,可以直接调用。

这让我们处理已明确声明的方法private,在这种情况下,答案似乎是错误的,see the JLS 17, section 8.4.8:

类不从其超接口类型继承私有或静态方法。

请注意,在接口中使用 private 方法是后来对该语言的补充;据我所知,它与 Java/JLS 8 不兼容(只有当你可以拥有 default 方法时才有意义,这是后来添加的)。

另请注意,当前表示的 Twins 类不打电话study 如果是这样,它将因编译错误而失败。它也无法编译,因为 write 和 think 方法未定义为 public;它们应该是因为您不能限制这些方法的可见性,并且在类中方法不是隐式的public,它们具有隐式包可见性。

我不知道你试图掌握的给定问题/代码的来源是什么,但是代码和答案是错误的。它还显示了一个糟糕的继承示例;即类设计也被破坏了。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-03-28
  • 2023-03-07
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
相关资源
最近更新 更多