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
@Override
public void test() {
System.out.println("testImpl");
}
public static void main(String[] args) {
InterServiceImpl interService = new InterServiceImpl();
interService.showDafault();
interService.test();
}
运行结果
showStatic
testImpl
可以重写接口中的default方法,示例代码如下:
实现类InterServiceImpl
@Override
public void showDafault() {
System.out.println("showDafaultImpl");
}
@Override
public void test() {
System.out.println("testImpl");
}
public static void main(String[] args) {
InterServiceImpl interService = new InterServiceImpl();
interService.showDafault();
interService.test();
}
运行结果如下:
showDafaultImpl
testImpl
如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法
新增接口InterServiceTemp,包含同样的**default**方法
default void showDafault(){
System.out.println("showDafault");
}
同时实现具有两个相同default方法的接口
public class InterServiceImpl implements InterService , InterServiceTemp {
@Override
public void showDafault() {
System.out.println("showDafaultImpl");
}
@Override
public 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{
@Override
public void test() {
System.out.println("testSuper");
}
public static void main(String[] args) {
InterServiceImpl interService = new InterServiceImpl();
interService.showDafault();
interService.test();
}
}
运行结果
showDafaultInterSuper
testSuper
可以在两个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("三王月");
}
}