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

在Java1.8中添加默认方法后,接口是否保持完全抽象?,java,methods,interface,java-8,Java,Methods,Interface,Java 8,在Java1.8中添加默认方法后,接口是否保持完全抽象 如果我不能清楚地说明问题,我很抱歉。清楚地说明(强调我的): 每个接口都是隐式抽象的。此修饰符已过时,不应在新程序中使用 除此之外,“完全抽象”一词对我来说毫无意义。这意味着什么?“部分抽象”是什么意思?没有这样的概念。即使界面中只有一个默认方法,它也将是抽象的。您必须提供实现类来实例化对象。请注意,Java8中添加的default方法有特殊用途。发件人: 默认方法允许您向接口添加新功能 并确保与所编写代码的二进制兼容性 对于那些接口的旧版

在Java1.8中添加默认方法后,接口是否保持完全抽象

如果我不能清楚地说明问题,我很抱歉。

清楚地说明(强调我的):

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


除此之外,“完全抽象”一词对我来说毫无意义。这意味着什么?“部分抽象”是什么意思?没有这样的概念。

即使界面中只有一个默认方法,它也将是抽象的。您必须提供实现类来实例化对象。请注意,Java8中添加的
default
方法有特殊用途。发件人:

默认方法允许您向接口添加新功能 并确保与所编写代码的二进制兼容性 对于那些接口的旧版本


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

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

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

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

    示例:

    在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(); 
    

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

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


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

    是的,它将保持抽象,并且您必须为其提供实现类。您所说的“完全”抽象到底是什么意思?为什么得出这样的结论“您应该明智地使用
    default
    方法"? 我不一定不同意,但我不明白您的断言是如何从引用中得出的。考虑一个场景,其中一个类实现了两个接口,并且两个接口都有一个具有相同签名的默认方法,您会得到编译时错误。当然,但这是问题吗?您怎么可能希望实现两个不同的接口,为同一方法指定不同的行为呢?我不明白为什么要明智地使用
    default
    方法,因为实现者可能会做一些不合理的事情,这是个问题。假设客户机代码正在实现来自两个库的接口,而这两个库的开发人员决定提供具有相同签名的默认方法实现,从而导致客户机端的代码中断。当然,这在理论上是危险的。在实践中,这并没有真正意义;为什么要实现两个不同的接口,用相同的方法做不同的事情?不过,我也不反对建议界面设计师要小心。我是问你在回答中从哪里提出这些问题。