差异的例子b / w抽象类&与Java 8中的默认方法接口

时间:2015-02-03 17:32:46

标签: java java-8

我知道已经有一个与此相关的问题,Interface with default methods vs Abstract class in Java 8但是在Java 8发布之前问了这个问题,它只是一个关于抽象类和接口与默认方法之间的区别的要点,它根本没有提供任何实际的例子,而是充满了冗长的解释。

我发布这个问题是因为我对一个实用的例子更感兴趣,它通过Java 8中的默认方法清除了抽象类和接口之间的区别。

看一下这个例子,

抽象类,

abstract class AbstractClass {

    public int var = 0;

    // These methods must be Overridden
    abstract int x();
    abstract int y();

    // This method is optional
    int z() {
        return 0;
    }

}

界面(Java 8)

interface Interface {

    public int var = 0;

    // These methods must be Overridden
    int x();
    int y();

    // This method is optional
    default int z(){
        return 0;
    }
}

如果我想向新手Java程序员(比如我自己)解释它的实际区别,我怎么能区分上面两个?

this文章说,

  

默认方法带来的好处是现在可以实现   向界面添加一个新的默认方法,它不会破坏   的实施方式。

这不可能是默认方法接口的唯一好处,或者是它?

1 个答案:

答案 0 :(得分:6)

首先,您应该了解

之间的区别
abstract class AbstractClass {

    public int var = 0;

…

interface Interface {

    public int var = 0;

    …

后者is equivalent to

   public static final int var = 0;

与写作完全不同

   public int var = 0;

abstract课程中。您已经通过说“Abstract classes can have state”链接的问题已经解释了这种差异。接口只能定义常量。这意味着您无法为default执行带有实例字段的任何操作提供interface方法,因为interface无法定义实例字段。 default方法只能在其他interface方法上使用。

有时它真的有助于理解“理性的解释”,而不是要求“一个实际的例子”。换句话说,您链接的问题和答案仍然有效。

关于Java 8中default方法的目的,那个问题has been asked before也是如此。

总结abstract类和interface之间的一些差异:

  • interface成员均为public,您无法定义privateprotected或包私人成员;当你省略它隐含的public修饰符时(从Java 9开始,允许使用private方法)
  • interface个字段仅用于定义常量;它们是隐含的static final
  • abstract类可以有static类初始化代码和实例构造函数
  • abstract类可能具有状态,即定义实例字段并提供使用它们的方法
  • abstract类可以为equals中定义的方法hashCodetoStringjava.lang.Object提供实现,同时在{default中指定interface方法1}} s无法覆盖这些方法
  • abstract个类可以定义finalstrictfpsynchronizednative方法
  • class只能扩展一个abstract或具体class,但可以实现多个interface