java8中的接口

默认方法和静态方法(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