本文主要是简单的说明下jdk8出现的一个新特性–接口的增强。此次变化中,接口中某些方法也可以有方法体了。jdk8对于接口的设计,除了保留之前的版本记本特性外,还提供了两个新的功能。除了抽象方法外,还可以有默认方法(default方法)和静态方法(static方法),此两个方法都可以拥有方法体。
新特性:默认方法 和 静态方法
在接口中用default关键字修饰的,可以拥有方法体的函数,成为默认方法或者扩展方法
同时在接口中可以使用static修饰一个拥有方法体的函数,就是接口中也可以有静态方法啦
如下:
public interface JDK8NewInterface {
//1.默认方法
default void testDefault()
{
System.out.println("I'm interface's default function");
}
//2.静态方法
static void testStatic()
{
System.out.println("I'm interface's static function");
}
}
简单应用
1.默认方法和静态方法不需要一定在实现类中去重写它们,当然,你也可以根据需要重写他们
public class JDK8NewInterfaceImpl implements JDK8NewInterface {
//默认方法不一定需要重写,你也可以根据需要重写
}
2.当实现类继承多个接口时,如果继承的接口中拥有相同的默认方法和静态方法时,我们需要重写默认方法,而不需要重写静态方法。因为静态方法可以通过类名直接调用,编译器可以区分出来;而默认方法需要对象调用,当实现类继承两个接口中有相同的默认方法时,导致编译失败而导致实现类必须重写此默认方法
public interface JDK8NewInterface2 {
//1.默认方法
default void testDefault()
{
System.out.println("I'm interface2's default function");
}
//2.静态方法
static void testStatic()
{
System.out.println("I'm interface2's static function");
}
}
//接口JDK8NewInterface和JDK8NewInterface2中都有testDefault,testStatic方法
public class JDK8NewInterfaceImpl implements JDK8NewInterface, JDK8NewInterface2 {
//默认方法不一定需要重写,但实现的两个接口中有相同的默认方法时,就需要重写
public void testDefault()
{
System.out.println("I'm interfaceImpl's default function");
}
}
通过上述实践,我们可以发现在接口中可以定义方法,可以在不破坏原来的实现这个类的所有类的原有结构,是在没有打破现有的继承体系的基础上实现了接口增强。而此次推出的这个新方法,已在现有的java.util.Collection中添加了一些新的默认方法,比如这次新特性中推出的新的默认方法forEach(),steam()等。不过,不推荐用默认方法,我也没有详细去了解,不过要是你去设计api的一些接口设计和架构设计,可以深入了解下。
问题探讨
接口中不能用默认方法重写toString/hashCode/equals方法呢?toString等方法是Object对象的,我们知道java中所有对象都是继承自Object对象,所以Object对象中有了toString对象的一般方法,而有个前提一个类实现了具体的一个实现方法,永远优先于默认方法的执行。由于任何接口也因为是Object的一个“子类”,都因此有了toString方法的一个非默认的实现,你再去给接口默认重写toString方法,实际上还是不会执行,而去执行Object父类的toString的非默认实现,显然,在接口中用default关键字去重写Object中toString等方法是没有意义的,所以,编译时就不能通过的。
由于新接口变化后,接口和抽象的异同显然也是有所变化,当面试再次问起时,应该注意JDK版本的变化,在这里就不列出其异同了。由于本人java水平有限,错误之处望指正