【问题标题】:What is the use of interface? how dynamic method resolution works at runtime?接口有什么用?动态方法解析在运行时如何工作?
【发布时间】:2010-10-22 23:56:31
【问题描述】:

抽象类和接口有什么区别?

【问题讨论】:

  • 你在面试吗?每次 Java 面试都会问这个问题。
  • 我培训的大多数不习惯 OO 理论的新开发人员不理解接口之类的背后的原因,因为如果没有一些合理的非人为示例,它看起来就像毫无意义地增加了复杂性。我通常所要做的就是以 List 为例,它为他们巩固了一切。
  • 谢谢大家。 @fuzzy 不过有一些例子会很好。
  • 标准库中的List接口就是一个例子。

标签: java interface


【解决方案1】:

接口是无状态的。他们不能给出变量,尽管他们可以有常数。 此外,接口提供了“按合同设计”的能力。 抽象类强制一个具体的实现,其中接口允许更大的灵活性,因为任何实现该接口的类都可以在运行时被替换。 此外,由于接口仅描述公开的行为,而不是实现,因此允许多重继承。 此外,抽象类更便于设计,因为它们提供编译器强制执行,因为子类必须实现抽象方法。 接口和抽象类是相关的,但用途不同。 在运行时检查对象的类型并调用相应的类方法。 这也称为后期绑定。 这是由运行时 VM 完成的,而不是由程序员完成的,因此将 If Else 测试从您的程序代码中取出。因此,您的代码更加灵活,并且不依赖于类类型来解析要调用的正确方法。因此我们也称多态。

【讨论】:

    【解决方案2】:

    抽象类可以实现方法。接口不能。同样一个类只能扩展一个抽象类,但可以实现多个接口。

    【讨论】:

      【解决方案3】:

      接口的使用:在软件工程中有很多情况,不同的程序员群体必须同意一份阐明他们的软件如何交互的“合同”,这一点很重要。每个组都应该能够编写他们的代码,而无需了解其他组的代码是如何编写的。一般来说,接口就是这样的契约。

      使用接口的一个好处是它们可以模拟多重继承。 Java 中的所有类(除了 java.lang.Object,Java 类型系统的根类)必须只有一个基类;不允许类的多重继承。此外,一个 Java 类可以实现,一个接口可以扩展任意数量的接口。但是一个接口可能不会实现一个接口。

      接口的另一种用途是能够在不知道其类类型的情况下使用对象,而只知道它实现了某个接口。

      抽象类和接口的区别:抽象类是包含一个或多个抽象方法的类,必须由子类实现。抽象类也不能包含抽象方法。 Java 接口只能包含方法声明和公共静态最终常量,不包含它们的实现。实现接口的类必须为所有存在的方法提供方法定义。抽象类意味着必须扩展该类。抽象类必须由继承树中的第一个具体类扩展。在抽象类中,我们可以有方法的声明和定义,但在接口中只有方法签名,根本没有定义。接口就像一个 100% 纯抽象类。一个类只能扩展一个类,但可以实现多个接口。 Interfaces 提供多重继承而不会导致deadly diamond of death 问题。

      【讨论】:

        【解决方案4】:
        【解决方案5】:

        缺点:当你有 1000 个类在你的库中实现一个接口时,明天如果你想在接口中有一个额外的方法,那么变化应该无处不在

        【讨论】:

        • 这不是缺点,这只是糟糕设计的症状,而不是接口存在的原因。这可能意味着接口应该是多个接口,但另一方面,一个接口应该代表一个统一的方法组是有原因的,如果一个新方法适合该组,那么它是合理的。这也是具体类之间的抽象类有一个“默认”无操作实现抛出 UnsupportedOperationException 的地方,无论哪种方式,这个“答案”都是完整的 FUD。
        • 如果一种新方法适合该组,那么它是合理的。
        猜你喜欢
        • 1970-01-01
        • 2020-01-27
        • 1970-01-01
        • 2018-04-17
        • 1970-01-01
        • 2016-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多