JDK8新特性-介面中增強的方法

介面中增強的方法

JDK8中介面的新增

在JDK8中介面有做增強

interface 介面名{
    靜態常量;
    抽象方法;
}

在JDK8之後對介面做了增強,介面可以有默認方法靜態方法

interface 介面名{
    靜態常量;
    抽象方法;
    默認方法;
    靜態方法;
}

默認方法

為什麼要有默認方法?在JDK8以前介面只能有抽象方法和靜態常量,會存在以下的問題:

如果介面中新增抽象方法,那麼所有實現類都必須要實現這個抽象方法,非常不利於介面的擴展。

package inter;

import javax.swing.*;

public class Demo01Interface {
    public static void main(String[] args) {
        A b=new B();
        A c=new C();
    }
}

interface A{
    void test1();
    //介面中新增抽象方法,所有實現類都需要重寫方法,不利於介面的擴展。
    void test2();
}

class B implements A{
    @Override
    public void test1() {

    }

    @Override
    public void test2() {

    }
}

class C implements A{
    @Override
    public void test1() {

    }

    @Override
    public void test2() {

    }
}

介面默認方法的語法格式

interface 介面名{
    修飾符 default 返回值類型 方法名{
        方法體;
    }
}

實例程式碼:

package inter;

import javax.swing.*;

public class Demo01Interface {
    public static void main(String[] args) {
        A b=new B();
        b.test3();
        A c=new C();
        c.test3();
    }
}

interface A{
    void test1();
    //介面中新增抽象方法,所有實現類都需要重寫方法,不利於介面的擴展。
    void test2();

    /**
     *
     * 介面中定義默認方法
     * @return
     */
    public default String test3(){
        System.out.println("介面中的默認方法執行了...");
        return "hello";
    }
}

class B implements A{
    @Override
    public void test1() {

    }

    @Override
    public void test2() {

    }

    @Override
    public String test3() {
        System.out.println("B實現類中重寫了默認方法...");
        return "ok";
    }
}

class C implements A{
    @Override
    public void test1() {

    }

    @Override
    public void test2() {

    }
}

結果

B實現類中重寫了默認方法...
介面中的默認方法執行了...
Process finished with exit code 0
介面中默認方法的使用

介面中默認方法有兩種使用:

  • 實現類直接調用介面的默認方法。
  • 實現類重寫介面的默認方法。

靜態方法

JDK8中為介面新增了靜態方法,作用是為了介面的擴展。

語法規則
interface 介面名{
    修飾符 static 返回值類型 方法名{
        方法體;
    }
}

示例程式碼

package inter;

import javax.swing.*;

public class Demo01Interface {
    public static void main(String[] args) {
        A b=new B();
        b.test3();
        A c=new C();
        c.test3();

        A.test4();
        //a.test4();  只能通過類調用,不能通過類的實例調用
    }
}

interface A{
    void test1();
    //介面中新增抽象方法,所有實現類都需要重寫方法,不利於介面的擴展。
    void test2();

    /**
     *
     * 介面中定義默認方法
     * @return
     */
    public default String test3(){
        System.out.println("介面中的默認方法執行了...");
        return "hello";
    }

    /**
     *
     * 介面中的靜態方法
     * @return
     */
    public static String test4(){
        System.out.println("介面中的靜態方法...");
        return "hello";
    }
}

class B implements A{
    @Override
    public void test1() {

    }

    @Override
    public void test2() {

    }

    @Override
    public String test3() {
        System.out.println("B實現類中重寫了默認方法...");
        return "ok";
    }

    //靜態方法無法重寫
}

class C implements A{
    @Override
    public void test1() {

    }

    @Override
    public void test2() {

    }
}

運行

B實現類中重寫了默認方法...
介面中的默認方法執行了...
介面中的靜態方法...

Process finished with exit code 0
介面中靜態方法的使用

介面中的靜態方法在實現類里時不能被重寫的,調用的時候只能通過介面名.靜態方法名()來調用。

兩者的區別介紹

  • 默認方法通過實力調用,靜態方法通過介面名調用。
  • 默認方法可以被繼承,實現類可以直接調用介面的默認方法,也可以重寫介面中默認方法。
  • 靜態方法不能被繼承,實現類不能被重寫介面的靜態方法, 是能使用介面名調用。