天天看點

200806學習筆記(接口)

接口是多個類的公共規範,接口是一種引用資料類型,最重要的内容是其中的抽象方法

定義一個接口的格式

public interface 接口名稱 {

// 接口内容

}

備注:換成了關鍵字interface之後,編譯生成的位元組碼檔案仍然是.java->.class

如果是java 7,那麼接口中可以包含的内容有:

1.常量

2.抽象方法

如果是java 8 ,還可以包含有:

3.預設方法

4.靜态方法

如果是java 9,還可以包含有:

5.私有方法

接口使用步驟:

1.接口不能直接使用,必須有一個“實作類”來“實作”該接口

格式:

public class 實作類名稱 implements 接口名稱{…}

2.接口的實作類必須覆寫重寫(實作)接口中所有的抽象方法

實作:去掉abstract關鍵字,加上方法體大括号

3.建立實作類的對象,進行使用

注意事項:

如果實作類并沒有覆寫重寫接口中所有的抽象方法,那麼這個實作類自己就必須是抽象類

抽象接口

/*
在任何版本的java中,接口都能定義抽象方法
格式:
public abstract 傳回值類型 方法名稱(參數清單);

注意事項:
1.接口當中的抽象方法,修飾符必須是兩個固定的關鍵字:public abstract
2.這兩個關鍵字修飾符,可以選擇性的省略
3.方法的三要素可以随意定義
 */
public interface MyInterfaceAbstract {
    //這是一個抽象方法
    public abstract void methodAbs();

    //這也是抽象方法
    abstract  void methodAbs2();
    public void methodAbs3();
    void methodAbs4();
}
           
public class MyInterfaceAbstractImpl implements MyInterfaceAbstract {

    @Override
    public void methodAbs() {
        System.out.println("方法");
    }
}
           
public static void main(String[] args) {
        //錯誤寫法,不能直接new接口對象使用
        //MyInterfaceAbstract inter = new MyInterfaceAbstract();

        //建立實作類的對象使用
        MyInterfaceAbstractImpl impl=new MyInterfaceAbstractImpl();
        impl.methodAbs();
    }
           

接口中添加新的方法時可以用預設方法

1.接口的預設方法可以通過接口實作類對象直接調用

2.接口的預設方法,也可以被接口實作類進行覆寫重寫

public interface MyInterfaceDefault {
    public abstract void methodAbs();
    //新添加了一個抽象方法會導緻實作報錯
    //public abstract void methodAbs2();
    //新添加的方法,改成預設方法,public可以不寫,default不能省略,就不報錯了
    public default void methodDefault(){
        System.out.println("這是新添加的預設方法");
    }
}
           

不重寫的

public class MyInterfaceDefaultA implements MyInterfaceDefault {
    @Override
    public void methodAbs() {
        System.out.println("實作了抽象方法AAA");
    }
}
           

重寫的

public class MyInterfaceDefaultB implements MyInterfaceDefault {
    @Override
    public void methodAbs() {
        System.out.println("實作了抽象方法BBB");
    }
    @Override
    public void methodDefault(){
        System.out.println("實作類B覆寫重寫了default方法");
    }
}
           
public static void main(String[] args) {
        //建立了實作類對象
        MyInterfaceDefaultA a=new MyInterfaceDefaultA();
        a.methodAbs();//調用抽象方法,實際運作的是右側實作類
        //調用預設方法,如果實作類當中沒有,會向上找接口
        a.methodDefault();

        MyInterfaceDefaultB b=new MyInterfaceDefaultB();
        b.methodAbs();
        b.methodDefault();
    }
           

結果:

實作了抽象方法AAA

這是新添加的預設方法

實作了抽象方法BBB

實作類B覆寫重寫了default方法

接口中的靜态方法

不能通過接口實作類的對象來調用接口當中的靜态方法

正确用法:通過接口名稱,直接調用其中的靜态方法

格式:

接口名稱.靜态方法名(參數)

public static void main(String[] args) {
        //建立了實作類對象。其實隻引用靜态方法都不用建立
        MyInterfaceStaticImpl impl=new MyInterfaceStaticImpl();

        //錯誤寫法
        //impl.methodStatic();

        //直接通過接口名稱調用靜态方法
        MyInterfaceStatic.methodStatic();
    }
           

靜态接口

/*
從java8開始,接口當中允許定義靜态方法
格式:
public static 傳回值類型 方法名稱(參數清單){方法體}
就是把abstract或者default換成static即可,帶上方法體
 */
public interface MyInterfaceStatic {

    public static void methodStatic(){
        System.out.println("這是接口的靜态方法");
    }
}
           

實作

接口中有方法使用同樣的内容時可以用私有方法,靜态就都加上static,也可以用

public interface MyInterfacePrivateA {

    public default void methodDefault1(){
        System.out.println("預設方法1");
        methodCommon();
    }
    public default void methodDefault2(){
        System.out.println("預設方法2");
        methodCommon();
    }
    private void methodCommon(){
        System.out.println("AAA");
        System.out.println("BBB");
        System.out.println("CCC");
    }
}
           
public interface MyInterfacePrivateB {

    public static void methodDefault1(){
        System.out.println("靜态方法1");
        methodStaticCommon();
    }
    public static void methodDefault2(){
        System.out.println("靜态方法2");
        methodStaticCommon();
    }
    private static void methodStaticCommon(){
        System.out.println("AAA");
        System.out.println("BBB");
        System.out.println("CCC");
    }
}
           
public static void main(String[] args) {
        MyInterfacePrivateB.methodDefault1();
        //錯誤寫法,private不能直接通路
        //MyInterfacePrivateB.methodCommon();
        MyInterfacePrivateAImpl impl= new MyInterfacePrivateAImpl();
        impl.methodDefault1();
    }
           

接口中的常量

接口當中也可以定義“成員變量”,但是必須使用public static final三個關鍵字進行修飾

從效果上看,這其實就是接口的【常量】

格式:

public static final 資料類型 常量名稱=資料值;

備注:一旦使用final關鍵字進行修飾,說明不可改變

注意事項:

1.接口中的常量,可以省略public static final,但一樣生效

2.接口當中的常量,必須進行指派,不能不指派

3.接口中常量的名稱,使用完全大寫的字母,用下劃線進行分隔

public interface MyInterfaceconst {
    //常量,一旦指派不可修改
    public static final int NUM=10;
}
           
public static void main(String[] args) {
        System.out.println(MyInterfaceconst.NUM);
    }
           

在java9+版本中,接口的内容可以有

1.成員變量其實是常量,格式:

[public] [static] [final]數值類型 常量名稱=資料值;

注意:

常量必須進行指派,而且一旦指派不能改變

常量名稱完全大寫,用下劃線進行分隔

2.接口中最重要的就是抽象方法,格式:

[public] [abstract] 傳回值類型 方法名稱(參數清單);

注意:實作類必須覆寫重寫接口所有的抽象方法,除非實作類是抽象類

3.從java8開始,接口裡允許定義預設方法,格式:

[public] default 傳回值類型 方法名稱(參數清單){方法體}

注意:預設方法也可以被覆寫重寫

4.從java8開始,接口裡允許定義靜态方法,格式:

[public]static 傳回值類型 方法名稱(參數清單){方法體}

注意:應該通過接口名稱進行調用,不能通過實作類對象調用接口靜态方法

5.從java9開始,接口裡允許定義私有方法,格式:

普通私有方法:private 傳回值類型 方法名稱(參數清單){方法體}

靜态私有方法:private static 傳回值類型 方法名稱(參數清單){方法體}

注意:private的方法隻有接口才能調用,不能被實作類或别人調用

改名shift+f6

使用接口的時候需要注意:

1.接口是沒有靜态代碼塊或構造方法

2.一個類的直接父類是唯一的,但是一個類可以同時實作多個接口

格式:

public class MyInterfaceImpl implements MyInterfaceA,MyInterfaceB{

//覆寫重寫所有抽象方法}

3.如果實作類所實作的多個接口當中存在重複的抽象方法,那麼隻需要覆寫重寫一次

4.如果實作類沒有覆寫重寫所有接口當中的所有抽象方法,那麼實作類就必須是一個抽象類

5.如果實作類所實作的多個接口當中,存在重複的預設方法,那麼實作類一定要對沖突的預設方法進行覆寫重寫

6.一個類如果直接父類當中的方法和接口當中的方法産生了沖突,優先用父類當中的方法

6.例子

public static void main(String[] args) {
        Son son=new Son();
        son.method();
    }
           
public class Father {
    public void method(){
        System.out.println("父類方法");
    }
}

public class Son extends Father implements MyInterface{
}

public interface MyInterface {
    public default void method(){
        System.out.println("接口的預設方法");
    }
}
           

結果:父類方法

1.類與類之間是單繼承的,直接父類隻有一個

2.類與接口之間是多實作的,一個類可以實作多個接口

3.接口與接口之間是多繼承的

注意事項:

1.多個父接口當中的抽象方法可以重複

2.多個父接口當中的預設方法不能重複,如果重複,子接口必須帶着default關鍵字進行預設方法的覆寫重寫

public interface MyInterface extends MyInterfaceA,MyInterfaceB {
    public abstract void method();}
           

一個類隻能extends一個父類,但可以implements多個接口。

一個接口則可以同時extends多個接口,卻不能implements任何接口。

Java中的接口是支援多繼承的。