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

bhu*_*esh 1 java java-8

我知道已经有一个与此相关的问题,在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;
    }

}
Run Code Online (Sandbox Code Playgroud)

接口(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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

这篇文章说,

默认方法带来的好处是,现在可以向接口添加新的默认方法,并且不会破坏实现.

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

Hol*_*ger 6

首先,你应该了解它们之间的区别

abstract class AbstractClass {

    public int var = 0;

…
Run Code Online (Sandbox Code Playgroud)

interface Interface {

    public int var = 0;

    …
Run Code Online (Sandbox Code Playgroud)

后者相当于

   public static final int var = 0;
Run Code Online (Sandbox Code Playgroud)

这与写作完全不同

   public int var = 0;
Run Code Online (Sandbox Code Playgroud)

abstract课堂上.通过说"抽象类可以具有状态"链接的问题已经解释了这种差异.接口只能定义常量.这意味着您无法提供使用实例字段执行任何操作的default方法,interface因为interface无法定义实例字段.default方法只能在其他interface方法上工作.

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

关于defaultJava 8 中方法的目的,之前也曾提出过这个问题.

总结一下abstract类和interfaces 之间的一些区别:

  • interface成员都是public,你不能定义private,protected或包私人成员; 当你省略public它隐含的修饰符时(从Java 9开始,private允许使用方法)
  • interface字段仅用于定义常量; 他们含蓄地说static final
  • abstract类可以有static类初始化代码和实例构造函数
  • abstract 类可以具有状态,即定义实例字段并提供使用它们的方法
  • abstract类可以为方法的实现equals,hashCode并且toString在定义java.lang.Object同时default在指定的方法interfaces不能重写这些方法
  • abstract类可以定义final,strictfp,synchronized,或native方法
  • a class只能扩展一个abstract或具体class但可以实现多个interface