Java8新特性默认接口方法和接口静态方法

什么是默认方法  

     在JDK8之前,接口中是不能定义任何实现的,也就是所8版本之前接口中的的所有方法都应该是抽象方法,没有方法体,这是传统的接口形式,Java8为接口添加了一项新功能,就是默认方法,默认方法允许为接口定义默认的实现,也就是说通过默认方法可以为接口方法提供实现的方法体,使其不再是抽象方法,也就意味着默认方法是子类非必须实现的方法,默认方法在开发时也成为扩展方法,所以这两个名称是一回事,默认方法的格式,参考下面的例子

默认方法的好处举例

      1:开发默认方法的主要目的是提供一种扩展接口的方式,而不破坏现有的代码。在以前,接口中定义的所有方法都必须要被实现,如果说为一个使用广泛的接口【即有较多的实现类】的情况下,如果在这个接口中添加一个新的方法,那么所有实现这个接口的子类都会因为没有实现这个新增的方法而报错,现有代码就遭到了破坏,而在Java8之后,默认方法就能解决这个问题,他提供一个实现,如果子类中没有这个方法的显示实现就会使用接口中的默认方法,因此,就不会破坏现有的代码。

     2:开发默认方法的另一个好处,比如在接口中有的方法是可选的,并非所有子类都要必须实现一定的逻辑【即不需要的功能,空逻辑,空实现】,比如接口中有一个add和remove方法,子类A有自己的add逻辑和remove逻辑,那么它实现这两个方法,实现自己的逻辑,而子类B,它只有add的逻辑,没有remove的逻辑,那么在Java8之前,子类AB都必须实现这两个方法,即使B类没有remove的逻辑,也必须有一个空的实现,而Java8之后,子类B就可以只实现add方法,remove方法不实现,而是在接口中添加remove的默认方法实现

package cn.cuit.stream;

public interface MyJava8Interface {
	void add();
	
	default void remove() {
		throw new UnsupportedOperationException("这个是一个不删除的集合");
	}
}
package cn.cuit.stream;

/**
 * 有自己的add和remove逻辑的子类
 */
public class MyJava8InterfaceImpl01 implements MyJava8Interface {

	@Override
	public void add() {
		System.out.println("add");
	}

	@Override
	public void remove() {
		System.out.println("remove");
	}
}
package cn.cuit.stream;

/**
 * 只有自己的add逻辑的子类
 */
public class MyJava8InterfaceImpl02 implements MyJava8Interface {

	@Override
	public void add() {
		System.out.println("MyJava8InterfaceImpl02 add");
	}
}

看看默认实现,因为01之类有自己的remove逻辑,更加多态,那么运行时就会调用自己的remove逻辑,而02子类没有自己的remove逻辑,那么在调用remove时,就会调用接口中的remove默认方法实现

注意

默认方法并没有改变接口的关键特征:不能维护状态信息,即依然不能有实例变量。因此接口与类之间决定性区别海慧寺类可以维护状态信息,而接口不可以,另外,接口本身仍然不能创建实例,必须被类实现,因此要创建实例还是必须通过具体的类来创建

一个更加实用的例子:

IntStack接口:

interface IntStack {
    void push(int item);
    int pop();
}

假设下面的IntStack接口有许多的子类实现了他,现在由于需求的变化,需要在IntStack中添加一个clear方法用于情况IntStack中的所有元素,现在添加了新的方法,有不想破坏原有的代码,在过去根本无法满足这种要求。但是现在有了默认方法,实现这点就很容易

interface IntStack {
    void push(int item);
    int pop();
    default void clear() {
        System.out.println("clear all item....");
    }
}

上面的clear方法只是简单的显示了一条消息,在之前IntStack没有clear方法,所以子类不会调用,现在增加了clear方法,具体的子类,如果需要就实现,不需要不实现

默认方法提供一下优点:

优雅的演化接口、提供可选功能,即类不必在不需要该功能的情况下强制要求实现

另外在真实的代码中,对于不需要实现的却调用了该方法,应该抛出异常,一般是UnsupportedOperationException

就如上面的第一个例子,MyJava8InterfaceImpl02类没有remove方法,加入在开发中却用它的实例调用了remove方法,那么就会抛出不支持的操作异常

接口中的静态方法

    Java8中接口的另一个新功能,定义一个或多个静态方法,和类中的静态方法类似,接口中定义的静态方法,同样独立与任何对象调用,因此,在调用接口中的静态方法的时候,也是不需要穿件接口实例的,直接通过接口名调用即可,与类调用静态方法一样

package cn.cuit.stream;

public interface MyJava8Interface {
	void add();
	
	default void remove() {
		throw new UnsupportedOperationException("这个是一个不删除的集合");
	}

    static String getDefaultStr() {
        return "HeiHeiHei";
    }
}

 注意:接口中的静态方法不会被子类所继承,即只能通过接口名调用接口中的静态方法,子类实例无法调用

********************************* 不积跬步无以至千里,不积小流无以成江海 *********************************

猜你喜欢

转载自blog.csdn.net/weixin_42465125/article/details/89332404