Java8—接口新特性

Java8中针对接口更新了一些特性,让它变得更加像类了,在此进行相应总结归纳。

  1. 接口中定义的静态方法,只能通过接口来调用
  2. 通过实现类的对象,可以调用接口中的默认方法,当然,该方法也可以被实现类重写
package Java8Template;

interface Template1 {
    public static void a(){
        System.out.println("接口静态方法运行!");
    }
    public default void b() {
        System.out.println("接口默认方法运行!");
    }
}

interface Template2 {
    public static void a(){
        System.out.println("接口静态方法运行!");
    }
    public default void b() {
        System.out.println("接口默认方法运行!");
    }
}
package Java8Template;

import AbstractTemplate.Template;

public class MyDemo implements Template1{
    public void myMethod() {
        Template1.a();  // 特性1
    }
  
    @Override
    public void b() {
        System.out.println("实现类中b方法运行");
    }
}
package Java8Template;

public class TestMyDemo {
    public static void main(String[] args) {
        MyDemo myDemo = new MyDemo();
        myDemo.myMethod();
      	myDemo.b();  // 特性2
    }
}

运行结果如下图:

  1. 如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没有重写次方法的情况下,默认调用的是父类中的同名同参数方法--->类优先原则
package Java8Template;

interface Template1 {
    public static void a(){
        System.out.println("接口静态方法运行!");
    }
    public default void b() {
        System.out.println("接口默认方法运行!");
    }
}

interface Template2 {
    public static void a(){
        System.out.println("接口静态方法运行!");
    }
    public default void b() {
        System.out.println("接口默认方法运行!");
    }
}
package Java8Template;

import AbstractTemplate.Template;

public class MyDemo extends FatherDemo implements Template1{
    public void myMethod() {
        Template1.a();
    }
}

class FatherDemo {
    public void b() {
        System.out.println("父类中b方法运行");
    }
}
package Java8Template;

public class TestMyDemo {
    public static void main(String[] args) {
        MyDemo myDemo = new MyDemo();
        myDemo.myMethod();
        myDemo.b();  // 特性3
    }
}

运行结果如下图:

  1. 如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,报错--->接口冲突,这就需要我们必须在实现类中重写此方法

  1. 如何在子类(或实现类)的方法中调用父类、接口中被重写的方法
接口名.super.方法名()

package Java8Template;

import AbstractTemplate.Template;

public class MyDemo extends FatherDemo implements Template1{
    public void b() {
        System.out.println("本类b方法运行!");
    }
    // 特性5
    public void myMethod() {
        b();  // 本类方法
        super.b();  // 父类方法
        Template1.super.b();  // 接口中默认方法
    }
}

class FatherDemo {
    public void a() {
        System.out.println("父类中a方法运行");
    }
    public void b() {
        System.out.println("父类中b方法运行");
    }
}
posted @ 2022-11-11 16:13  Pluto_Evans  阅读(195)  评论(0)    收藏  举报