Java 8接口默认定义方法和静态定义方法

从Java 8开始接口默认定义方法

  • 接口中的默认方法可以解决接口升级的问题,比如某个接口被很多个实现方法实现了,n年以后,这个接口升级了,比方说多了一个功能,那么每个接口实现方法都要加那一条接口的实现方法,很麻烦,所以有默认接口实现就可以不需要再去每一个实现方法中实现了
  • 格式
public default 返回值类型 方法名称(参数列表){
	//方法体
}
  • 接口的默认方法,可以通过接口实现类对象,直接调用
  • 接口的默认方法,也可以被接口实现类进行覆盖重写
public interface MyInterfaceDefault {
    public abstract void first();
    
    //默认接口实现
    public default void defaultInterface(){//public可以省略
        System.out.println("default implementation");
    }

}
public class MyInterfaceDefaultImpl01 implements MyInterfaceDefault{
    @Override
    public void first() {
        System.out.println("implementation 1");
    }
}
public class MyInterfaceDefaultImpl02 implements MyInterfaceDefault{

    @Override
    public void first() {
        System.out.println("implementation 2");
    }

    //重写默认接口实现
    @Override
    public void defaultInterface(){
        System.out.println("Overrode implementation");
    }
}
public class Demo02Interface {
    public static void main(String[] args) {
        MyInterfaceDefaultImpl01 impl01 = new MyInterfaceDefaultImpl01();
        impl01.first();
        impl01.defaultInterface();
        System.out.println("=================");

        MyInterfaceDefaultImpl02 impl02 = new MyInterfaceDefaultImpl02();
        impl02.first();
        impl02.defaultInterface();
    }
}
implementation 1
default implementation
=================
implementation 2
Overrode implementation

Java 8开始支持静态接口方法

public interface MyInterfaceStatic {
    public static void staticMethod(){
        System.out.println("这是接口的静态方法");
    }
}
public class MyInterfaceStaticImpl {
    //实现类不需要对静态方法重写
}
public class Demo03Interface {
    public static void main(String[] args) {
        MyInterfaceStaticImpl impl01 = new MyInterfaceStaticImpl();
//        impl01.staticMethod(); 用实现对象去调用接口的静态方法是错误的

        MyInterfaceStatic.staticMethod();
    }
}
  • 这些方法不能由实现它的类继承(static method may be invoked on containing interface class only. )。 这样做是有道理的,因为一个类可以实现多个接口。如果2个接口具有相同的静态方法,它们都将被继承,编译器就不知道要调用哪个接口。
  • 然而如果是继承某个类,而非实现某接口,就可以用这个继承的类调用,因为继承只能继承一个,不会存在歧义。
//以下下方法可以
Class A { 
    static void staticMethod() {
        println();
        }
    }
Class B extends A {
    }
B.staticMethod();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值