Java8知识点总结之接口默认的方法

317 阅读2分钟

参考资料:blog.csdn.net/zhwyj1019/a…

参考资料:www.runoob.com/java/java8-…

一、为什么要有这个特性?

首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8 之前的集合框架没有 foreach 方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。

二、接口默认方法介绍

1.Java8中允许接口中包含具有具体实现的方法,这种方法被称为“默认方法”,使用default关键字修饰。如:

public interface MyInterface {
    String notDefault();
    default String testDefault() {
        return "Hello Default Method";
    }
}

2.该接口的实现类中只需要实现抽象方法即可,默认方法可以直接使用。

MyInterface myInterface = new MyInterface() {
    @Override
    public String notDefault() {
        return "这不是一个default方法,实现类需要重写这个方法";
    }
};
System.out.println(myInterface.notDefault());
System.out.println(myInterface.testDefault());

解释:就是说testDefault这个方法可以直接使用 只要把对象new出来就可以直接调用

三、接口中默认方法的“类优先”原则:

若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时

  • 选择父类中的方法。如果一个父类中提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。 测试代码:
public class MySuperClazz { 
public String testDefault() { 
return "This is default method";
 }
 }
 public interface MyInterface {
 default String testDefault() {
 return "Hello Default Method"; 
} 
}
 public class MyClazz extends MySuperClazz implements MyInterface{
 }
 MyClazz myClazz = new MyClazz();
 System.out.println(myClazz.testDefault());

输出结果:
This is default method  // 优先输出父类

输出结果:

This is default method

  • 接口冲突,如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么实现类必须覆盖该方法来解决冲突。
	public class MyClazz implements MyInterface,MyInterface2{
	 @Override
	 public String testDefault() {
	 return "测试两个接口中同名方法"; 
	}
	 }
	 public interface MyInterface2 {
	 default String testDefault() {
	 return "Hello Default Method2";
	 }
	 } 
	public interface MyInterface { 
	default String testDefault() { 
	return "Hello Default Method";
	 }
 }

输出结果:

测试两个接口中同名方法

四、接口中也可以声明静态方法

public interface MyInterface { 
static void testStatic()
 {
 System.out.println("静态方法"); 
}
 }