如果对象是隐式抽象的,为什么Java允许您从部分实现接口的类创建对象?

如果对象是隐式抽象的,为什么Java允许您从部分实现接口的类创建对象?,java,Java,我在HPrinter类上遇到一个编译器错误,它说要包含未实现的方法或使我的类抽象,这显然是正确的,但我不明白的是,为什么java允许创建该类的对象,我知道它不是显式抽象的,而是隐式的。我知道我不会调用未实现的方法,如果我这样做,我会得到一个错误,但首先它不应该让您创建HPrinter类的对象,不是吗?以下是一个例子: public interface Printer { void print(); void scan(); } public class HPrinter impleme

我在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接口可以有以下任何方法

抽象方法 默认方法 静态方法 PS:仅对java语言版本8及以上版本有效

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

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

静态方法不是由实现接口的类继承的,它只能通过使用接口的名称来调用


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

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

允许创建,但给出错误。。。抱歉,很难理解您不,Java不允许这样做。要么实现所有必需的方法,要么将类标记为抽象类。你真的试过编译这段代码吗?如果你真的可以运行代码,我很确定你在添加扫描方法之前有一个编译过的版本。如果你有编译器错误,Java是如何允许你这么做的?你应该实现扫描方法,这是任何实现类的规则。您可以将HPrinter类作为对象,这不是一个冲突。如果您使用Eclipse,请查看和/或使用一些代码示例,这可能是一个更好的答案?我希望您不要混淆运行时多态性和简单继承。契约遵从性意味着所有具体类都需要为它们正在实现的抽象类或接口提供实现,或者它们将自己标记为抽象类。现在有了这些关键字{default,static},您可以添加方法体,但OP并不是这样做或询问的。谢谢您的回答。我理解你说的是编译器通知我有一个未实现的方法,我的IDE在HPrinter类上向我显示了错误,但这并不能避免虚拟机加载该类,因为虚拟机不会检查它是否实现了所有接口方法,我可以运行这样的程序。不,我并没有混淆政治主义。也许我对编译器错误有误解。我想我不应该运行这样一个错误的程序。我知道我应该实现接口的所有方法,或者像你说的那样抽象类。实际上,我在教oop,我在告诉我的学生,其中一个告诉我他不能实现所有的方法,他的程序运行得很好。当然,这并不意味着它是正确的,如果调用未实现的方法,它当然会抛出运行时错误。我只是想向他们解释为什么这是可能的。