static方法
java8中为接口新增了一项功能:定义一个或者更多个静态方法。用法和普通的static方法一样。注意,实现接口的类或者子接口不会继承接口中的静态方法
_
示例代码
public interface InterService {public static final String name = "玥玥玥";public abstract void test();static void showStatic(){System.out.println("showStatic");}}
运行测试
public static void main(String[] args) {InterService.showStatic();System.out.println(InterService.name);}
结果
showStatic玥玥玥
default方法
也可以称为Defender方法,或者虚拟扩展方法(Virtual extension methods)。Default方法是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。 比如,只需在Collection接口中增加default Stream stream(), 相应的Set和List接口以及它们的子类都包含此的方法,不必为每个子类都重新copy这个方法
为什么需要这个方法
之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的java8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。
默认使用接口的default方法,示例代码如下:
接口InterService
public static final String name = "玥玥玥";static void showStatic(){System.out.println("showStatic");}default void showDafault(){System.out.println("showDafault");}public abstract void test();
实现类InterServiceImpl
@Overridepublic void test() {System.out.println("testImpl");}public static void main(String[] args) {InterServiceImpl interService = new InterServiceImpl();interService.showDafault();interService.test();}
运行结果
showStatictestImpl
可以重写接口中的default方法,示例代码如下:
实现类InterServiceImpl
@Overridepublic void showDafault() {System.out.println("showDafaultImpl");}@Overridepublic void test() {System.out.println("testImpl");}public static void main(String[] args) {InterServiceImpl interService = new InterServiceImpl();interService.showDafault();interService.test();}
运行结果如下:
showDafaultImpltestImpl
如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法
新增接口InterServiceTemp,包含同样的**default**方法
default void showDafault(){System.out.println("showDafault");}
同时实现具有两个相同default方法的接口
public class InterServiceImpl implements InterService , InterServiceTemp {@Overridepublic void showDafault() {System.out.println("showDafaultImpl");}@Overridepublic void test() {System.out.println("testImpl");}}
必须要重写showDafault方法,不然会编译出错:
如果子类继承父类,父类中有showDefault方法,该子类同时实现的接口中也有showDefault方法(被default修饰),那么子类会继承父类的showDefault方法而不是继承接口中的showDefault方法
新增父类InterSuper
public void showDafault() {System.out.println("showDafaultInterSuper");}
InterServiceImpl继承InterSuper并实现InterService接口
public class InterServiceImpl extends InterSuper implements InterService{@Overridepublic void test() {System.out.println("testSuper");}public static void main(String[] args) {InterServiceImpl interService = new InterServiceImpl();interService.showDafault();interService.test();}}
运行结果
showDafaultInterSupertestSuper
可以在两个interface中实现重载的功能
示例代码
接口InterServiceA
public static final String name = "玥玥玥";default void showDafault(Integer i){System.out.println("showDafault"+i);}
接口InterServiceB
public static final String name = "三王月";default void showDafault(String mess){System.out.println("showDafault"+mess);}
实现类InterServiceTempAB
public class InterServiceTempAB implements InterServiceA , InterServiceB {public static void main(String[] args){InterServiceTempAB interService = new InterServiceTempAB();interService.showDafault(new Integer(12));interService.showDafault("三王月");}}
