【问题标题】:Java- What can be done by interfaces that can not be done by abstract class?Java-抽象类无法完成的接口可以做什么?
【发布时间】:2014-12-18 11:31:40
【问题描述】:

我知道“接口”和“抽象类”之间的区别。但是您能否提供一个可以通过“接口”构建但不能通过“抽象类”构建的单个示例,留下“多重继承”的示例?

【问题讨论】:

标签: java interface abstract-class


【解决方案1】:

一个简单的例子是代表相同实体但具有不同行为的对象。以鸟类为例。有些鸟会飞,有些不会。定义一个 abstract class Bird 是错误的,它会强制它的所有子类实现 fly 方法。

因此,在这种情况下,可以在 abstract class Bird 中将方法定义为 eat()sleep() 作为抽象,但不能在 fly() 中定义,因为并非所有鸟类都能飞。

通常您会定义一个调用实例Flyable 的接口,其中包含fly() 方法的定义,该方法必须被实现该接口的类覆盖。

最后你会得到类似的东西:

public abstract class Bird{
  public abstract void eat();
  public abstract void sleep();
}

public interface Flyable{
  void fly();
}

public class Eagle extends Bird implements Flyable{ 
 .... has to implement eat(), sleep() and fly()
}

public class Ostrich extends Bird{
... has to implement only eat() and sleep() since ostrich can't fly
}

【讨论】:

    【解决方案2】:

    100% 百分比的抽象称为接口。

    List 是一个接口。它只是 jas 方法定义。

    抽象类:它有一些方法实现。

    AbstractList 是一个抽象类。它有方法实现。

    【讨论】:

    • "100% 的抽象被称为接口。" Java 8 default methods 不是这样的
    • @Regent 有一些区别,大家可以看看stackoverflow.com/q/19998454/1820501stackoverflow.com/q/20139404/1820501
    • @FlorentBayle 好吧,是的,这一切都以接口和抽象类之间的差异而告终。以及使用没有状态(字段)的默认方法。最有趣的是,如果两个接口都具有默认相同的方法,您将无法实现它们。是的,这是合乎逻辑的(与扩展两个类的故事相同),但它会给将来使用default 的人带来麻烦,这是肯定的。
    【解决方案3】:

    java.lang.Comparable 中的 Comparable 接口永远不能实现为类(即抽象类) 这是因为 compareTo 方法完全依赖于实现它的类。并且要求所有的对象比较都应该实现这个方法(被比较的对象)

    注意:Comparable 类用于比较两个对象是否相等

    而 AbstractStringBuilder 写得更好,因为抽象类由 StringBuilder 和 StringBuffer 扩展。 这样,两个类中的通用功能(如 charAt、expandCapacity、indexOf )都可以放在这个抽象类中。这样可以重用代码,而在接口的情况下则不能

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-17
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多