在java 1.8中添加默认方法后,接口是否保持完全抽象?

时间:2016-07-13 05:03:06

标签: java methods interface java-8

在java 1.8中添加默认方法后,接口是否保持完全抽象?

如果我无法清楚说明问题,我很抱歉。

4 个答案:

答案 0 :(得分:5)

JLS8 §9.1.1.1. (Abstract Interfaces)明确指出(强调我的):

  

每个界面都是隐式抽象的。此修饰符已过时,不应在新程序中使用。

除此之外,术语"完全抽象"对我来说没有意义。这应该是什么意思?会是什么?#34;部分抽象"意思?没有这样的概念。

答案 1 :(得分:3)

即使您的界面中只有一个默认方法,它也是抽象的。您必须提供实现类来实例化对象。请注意,Java 8中添加的default方法具有特殊用途。来自Java doc

  

默认方法使您可以向界面添加新功能   您的库并确保与编写的代码的二进制兼容性   对于那些接口的旧版本。

所以你应该明智地使用default方法。

答案 2 :(得分:2)

在我看来,是的。事实上,接口中的默认方法已经缩小了接口和抽象类之间的差异。默认方法将有助于实现接口而不会破坏现有代码。

关于java接口默认方法的重点:

  
      
  1. Java 8接口默认方法将帮助我们避免实用程序类,例如可以提供所有Collections类方法   接口本身。
  2.   
  3. Java接口默认方法将帮助我们删除基本实现类,我们可以提供默认实现和   实现类可以选择覆盖哪一个。
  4.   
  5. 在接口中引入默认方法的一个主要原因是增强Java 8中的Collections API以支持   lambda表达式。如果层次结构中的任何类具有方法   相同的签名,然后默认方法变得无关紧要。
  6.   
  7. 默认方法不能覆盖java.lang.Object中的方法。推理非常简单,因为Object是基类   对于所有java类。即使我们有Object类方法   在接口中定义为默认方法,因为它是无用的   始终使用对象类方法。这就是为什么要避免   混淆,我们不能有重写Object的默认方法   类方法。
  8.   
  9. Java接口默认方法也称为Defender方法或虚拟扩展方法。
  10.   

来源: Java 8 Interface Changes – static method, default method

示例:

在Java 8之前,我的界面更像是下面我们无法在实现中添加方法:

public interface OldInterface {
    public void existingMethod();
}

在Java 8之后,我们可以添加默认方法,因此新界面将如下:

public interface OldInterface {
    public void existingMethod();

    default public void newDefaultMethod() {
        System.out.println("Default Interface method added in Java 8");
    }
}

以下课程将正常工作:

public class OldInterfaceImpl implements OldInterface {
    public void existingMethod() {
     // existing implementation is here…
    }
}

我们可以创建OldInterfaceImpl的实例:

OldInterfaceImpl obj = new OldInterfaceImpl ();
// print “New default method add in interface”
obj.newDefaultMethod(); 

答案 3 :(得分:1)

我相信你在询问是否存在关于具有默认方法的接口的“具体”或“非抽象”的东西。答案是不。类具有存储在实例字段中的状态,并且具体地与类的特定实例相关联。接口没有状态(即它们不能定义字段),因此使用你的术语是“完全抽象的”。

Java 8添加了默认方法,因此现在您可以指定方法的默认行为,但仅根据接口中的其他方法,而不是根据对象中的任何状态(因为在定义方法时没有这样的对象)。从概念上讲,默认方法只允许实现在完全根据接口中的其他方法定义方法时避免样板代码。例如,Collection.addAll()可以根据循环中调用的Collection.add()来定义。这样做不会影响实现接口的任何类的状态 - 它们仍然可以通过定义所有非默认方法来完全控制类。

将此与抽象类进行对比,可以具有实例字段,因此具有与子类无法阻止的每个实例相关联的具体状态。