默认方法和静态方法(JDK8特性)
默认方法:使用 default 修饰,不可省略,供子类调用或者子类重写。
静态方法:使用 static 修饰,供接口直接调用。
代码如下:
public interface InterFaceName {
public default void method() {
// 执行语句
}
public static void method2() {
// 执行语句
}
}
重写默认方法(JDK8特性)
代码如下:
定义接口:
public interface LiveAble {
public default void fly(){
System.out.println("天上飞");
}
}
定义实现类:
public class Animal implements LiveAble {
@Override
public void fly() {
System.out.println("自由自在的飞");
}
}
定义测试类:
public class InterfaceDemo {
public static void main(String[] args) {
// 创建子类对象
Animal a = new Animal(); // 调用重写方法
a.fly();
}
}
执行结果
自由自在的飞
静态方法的使用(JDK8特性)
静态与.class 文件相关,只能 通过接口名调用,不可以通过实现类的类名或者实现类的对象调用,代码如下: 定义接口:
public interface LiveAble {
public static void run(){
System.out.println("跑起来~~~");
}
}
定义实现类:
public class Animal implements LiveAble { // 无法重写静态方法
}
定义测试类:
public class InterfaceDemo {
public static void main(String[] args) {
// Animal.run(); // 【错误】无法继承方法,也无法调用
LiveAble.run(); //
}
}
输出结果:
跑起来~~~
默认方法(JDK8特性)
接口中,有多个默认方法时,实现类都可继承使用。如果默认方法有重名的,必须重写一次。代码如下:
定义多个接口:
interface A {
public default void methodA(){} public default void method(){}
}
interface B {
public default void methodB(){} public default void method(){}
}
定义实现类:
public class C implements A,B{ @Override
public void method() { System.out.println("method");
} }
静态方法(JDK8特性)
接口中,存在同名的静态方法并不会冲突,原因是只能通过各自接口名访问静态方法。
优先级的问题
当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执
行父类的成员方法。代码如下:
定义接口
interface A {
public default void methodA(){
System.out.println("AAAAAAAAAAAA"); }
}
定义父类:
class D {
public void methodA(){
System.out.println("DDDDDDDDDDDD"); }
}
定义子类:
class C extends D implements A { // 未重写methodA方法
}
定义测试类:
public class Test {
public static void main(String[] args) {
C c = new C();
c.methodA(); }
}
输出结果: DDDDDDDDDDDD