在Java1.8中添加默认方法后,接口是否保持完全抽象?
在Java1.8中添加默认方法后,接口是否保持完全抽象 如果我不能清楚地说明问题,我很抱歉。清楚地说明(强调我的): 每个接口都是隐式抽象的。此修饰符已过时,不应在新程序中使用在Java1.8中添加默认方法后,接口是否保持完全抽象?,java,methods,interface,java-8,Java,Methods,Interface,Java 8,在Java1.8中添加默认方法后,接口是否保持完全抽象 如果我不能清楚地说明问题,我很抱歉。清楚地说明(强调我的): 每个接口都是隐式抽象的。此修饰符已过时,不应在新程序中使用 除此之外,“完全抽象”一词对我来说毫无意义。这意味着什么?“部分抽象”是什么意思?没有这样的概念。即使界面中只有一个默认方法,它也将是抽象的。您必须提供实现类来实例化对象。请注意,Java8中添加的default方法有特殊用途。发件人: 默认方法允许您向接口添加新功能 并确保与所编写代码的二进制兼容性 对于那些接口的旧版
除此之外,“完全抽象”一词对我来说毫无意义。这意味着什么?“部分抽象”是什么意思?没有这样的概念。即使界面中只有一个默认方法,它也将是抽象的。您必须提供实现类来实例化对象。请注意,Java8中添加的
default
方法有特殊用途。发件人:
默认方法允许您向接口添加新功能
并确保与所编写代码的二进制兼容性
对于那些接口的旧版本
所以你应该明智地使用默认方法。在我看来,是的。事实上,接口中的默认方法已经弥合了接口和抽象类之间的差异。默认方法将有助于在不破坏现有代码的情况下实现接口 关于java接口默认方法的要点:
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
方法,因为实现者可能会做一些不合理的事情,这是个问题。假设客户机代码正在实现来自两个库的接口,而这两个库的开发人员决定提供具有相同签名的默认方法实现,从而导致客户机端的代码中断。当然,这在理论上是危险的。在实践中,这并没有真正意义;为什么要实现两个不同的接口,用相同的方法做不同的事情?不过,我也不反对建议界面设计师要小心。我是问你在回答中从哪里提出这些问题。