【问题标题】:When i need to use abstract class and interface in Java? [duplicate]什么时候需要在 Java 中使用抽象类和接口? [复制]
【发布时间】:2010-10-05 17:45:37
【问题描述】:

可能重复:
Abstract class and Interface class?

什么时候需要在Java中使用抽象类和接口?

我的怀疑是

  1. 哪些情况需要使用抽象类,哪些情况需要使用接口。
  2. 接口满足抽象类属性。那么为什么我们特别需要抽象类呢?
  3. 我知道,抽象类包含抽象方法和非抽象方法,但是我们可以将抽象类当作普通类使用,那么这两个类的结果是一样的。普通类也继承了抽象类。那么为什么我们需要抽象类。

如果有人知道好的例子,请回复我。

谢谢。

【问题讨论】:

  • 也强烈推荐这个问题的答案:stackoverflow.com/questions/56867/interface-vs-base-class
  • 如果这些陈述中的任何一个适用于您的情况,请考虑使用抽象类: - 您希望在几个密切相关的类之间共享代码。 - 您希望扩展抽象类的类具有许多公共方法或字段,或者需要公共以外的访问修饰符(例如受保护和私有)。 - 您要声明非静态或非最终字段。这使您能够定义可以访问和修改它们所属对象的状态的方法。

标签: java


【解决方案1】:

抽象类的另一个重要方面是,与接口不同,向其添加新方法不会破坏二进制兼容性。因此,从 API 演进的角度来看,尤其是当您可以期待添加到公共 API 时,抽象类更可取。

【讨论】:

    【解决方案2】:

    我会说有两种类型的继承。一种是实现继承,另一种是合同继承。

    抽象类用于实现继承。您可以扩展/更改超级/父类的行为。

    接口将用于合同继承。您更感兴趣的是让类实现某种契约(带有参数的服务方法 - 更多的契约)并且不同实现的行为不同,没有什么通用的可以捆绑在抽象类中并扩展行为.

    【讨论】:

      【解决方案3】:

      如果要应用模板模式http://en.wikipedia.org/wiki/Template_method_pattern,则需要使用抽象类,通常在框架代码中。根据经验,如果您不打算实现模板模式,那么最好使用允许松散耦合的接口,就像 spring 框架那样。松耦合导致设计对进化开放并具有更好的可测试性,使用模拟对象 (http://easymock.org) 等技术

      【讨论】:

      • 嗨,当我们需要使用重载和覆盖时,如果你知道好的例子请告诉我。
      • 重载与抽象类和接口无关。重载是拥有一个与现有方法同名的方法,但具有不同种类或数量的参数。重写是在子类中重新定义超类的方法。见stackoverflow.com/questions/154577/…的回答,那里有例子。
      猜你喜欢
      • 2012-12-13
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多