【问题标题】:Why does Java allow you to create an object from a class that implements partially an interface if it is implicitly abstract? [duplicate]如果Java是隐式抽象的,为什么Java允许您从部分实现接口的类创建对象? [复制]
【发布时间】:2019-02-09 19:31:30
【问题描述】:

我在 HPrinter 类上遇到编译器错误,说要包含未实现的方法或使我的类抽象,这显然是正确的,但我不明白为什么 java 允许创建该类的对象,我知道不是显式抽象的,而是隐式的。我知道我不调用未实现的方法,如果我这样做了,我会得到一个错误,但首先它不应该让你创建一个 HPrinter 类的对象,不是吗?这是一个例子:

public interface Printer {
  void print();
  void scan();
}

public class HPrinter implements Printer {  
  public void print() {
    System.out.println("print()");
  }
}

public class TestInterface {
  public static void main(String[] args) {
    Printer p=new HPrinter();
    p.print();
  }
}

【问题讨论】:

  • 允许创建但给出错误...对不起,很难理解你
  • 不,Java 不允许这样做。要么实现所有(必需的)方法,要么将您的类标记为抽象。您是否真的尝试编译此代码? (如果你真的可以运行代码,我很确定你有一个在添加扫描方法之前的编译版本。)
  • 如果您遇到编译器错误,¿Java 是如何允许您这样做的?
  • 您应该实现 scan() 方法,这是任何实现类的规则。您可以制作 HPrinter 类的对象,这不是违规。

标签: java


【解决方案1】:

Java 接口可以有以下任何一种方法...

  • 抽象方法
  • 默认方法
  • 静态方法

(PS:仅对java语言8及以上版本有效。)

如果一个类实现了一个接口,它必须为它正在实现的接口的所有抽象方法提供实现。

默认方法不需要实现,由实现接口的类自动继承,但可以重写

静态方法不被实现接口的类继承,只能通过接口名调用

但是需要注意的是,如果一个抽象类实现了一个接口,它不需要为它的所有抽象方法提供实现,而且抽象类不能被实例化。

【讨论】:

  • 使用一些代码示例可能会是一个更好的答案吗?
【解决方案2】:

Java 类的合同合规性由编译器静态检查。虚拟机负责字节码的加载、验证和运行。它不检查某个类是否实现了某个接口的所有方法。

【讨论】:

  • 我希望您不要将运行时多态性与简单继承混淆。合同合规意味着所有具体类都需要为它们正在实现的抽象类或接口提供实现,或者它们将自己标记为抽象。现在使用这些关键字{default, static}您可以添加方法主体,但这不是 OP 正在做或询问的内容。
  • 感谢您的回答。我理解你所说的是编译器通知我我有一个未实现的方法,我的 IDE 向我显示 HPrinter 类上的错误,但这并不能避免虚拟机加载该类,因为虚拟机没有'不检查它是否实现了我可以运行这样的程序的所有接口方法。
  • 不,我没有混淆 polimorfism。也许我对编译器错误有误解。我认为我不应该能够运行出现这样的错误的程序。我知道我应该实现接口的所有方法或像你说的那样使类抽象。实际上,我在教 oop,我把这个告诉我的学生,其中一个告诉我他无法实现所有方法,他的程序运行得很好。当然,这并不意味着它是正确的,如果你调用未实现的方法当然会抛出运行时错误。我只是想向他们解释为什么它是可能的。
猜你喜欢
  • 1970-01-01
  • 2017-03-03
  • 2012-01-20
  • 2019-06-09
  • 2018-09-10
  • 2011-11-09
  • 2010-09-20
  • 2014-02-05
  • 1970-01-01
相关资源
最近更新 更多