1. 程式人生 > >Java應用程式開發學習之介面

Java應用程式開發學習之介面

一、介面的抽象方法定義:

在任何版本的java中,介面都能定義抽象方法
格式:

public abstract 返回值型別 方法名稱(引數列表);

注意事項:
1.介面當中的抽象方法,修飾符必須是兩個固定的關鍵字:public abstract
2.這兩個關鍵字修飾符,可以選擇性省略
3.方法的三要素,可以隨意定義

ep:

public interface xxx{
    public abstract void xxx1();
    abstract void xxx2(); 
    void xxx3();
}


二、介面使用步驟

1.介面不能直接使用,也就是不能例項化,必須有一個實現類來實現介面
格式:

public class 類名稱 implements 介面名稱
{
    //....
}

2.介面的實現類必須覆蓋重寫介面中所有的抽象方法
   也就是去掉 abstract關鍵字,加上方法體大括號
3.建立實現類的物件,進行使用

注意事項:
如果實現類並沒有覆蓋重寫介面中所有的抽象方法,那麼這個實現類自己就必須是抽象類


三、預設方法定義和使用(從Java8開始,接口裡允許定義預設方法)===>重寫介面中所有的抽象方法(解決)


1.介面的預設方法,可以通過介面實現類物件,直接呼叫。
2.介面的預設方法,也可以被介面實現類進行覆蓋重寫。

格式:

public default 返回值型別 方法名稱(引數列表)
{
    方法體
}

備註:介面當中的預設方法,可以解決介面升級的問題

定義使用:

public interface xxx{
    public abstract void xxx1();
    abstract void xxx2(); 
    void xxx3();
    //新新增的方法,改成預設方法
    public default void methodDefault()
    {
        //xxxx
        //實現
    }
}

public class 類名稱 implements 介面名稱xxx
{
    public abstract void xxx1()
    {
    
    }
    //如果不寫上面的介面不寫預設方法,則會報錯,寫了預設方法則不報錯
    
}

介面名稱 a = my 介面名稱();    //建立實現類物件
a.xxx1();            //呼叫實現的抽象方法
a.methodDefault();    //呼叫預設方法


四、介面中定義靜態方法(從Java8開始,允許定義)


格式:

public static 返回值型別 方法名稱(引數列表){
    方法體
}

提示:就是將abstract或者default換成static即可,帶上方法體。
注意:不能通過介面實現類的物件來呼叫介面當中的靜態方法
正確使用:通過介面名稱,直接呼叫其中的靜態方法。

public interface xxx{
    public static void methodStatic()
    {
        System.out.println("這是介面的靜態方法!");
    }
}

正確做法:xxx.methodStatic();

五、介面中定義私有方法(從Java9開始,允許定義)

問題描述:
我們需要抽取一個共有方法,用來解決兩個預設方法之間重複程式碼的問題。
但是這個共有方法不應該讓實現類使用,應該是私有化的。

解決方案:
從Java9開始,介面當中允許定義私有方法:
1.普通私有方法,解決多個預設方法之間重複程式碼問題
格式:

private 返回值型別 方法名稱(引數列表){
    方法體
}


2.靜態私有方法,解決多個靜態方法之間重複程式碼問題
格式:

private static 返回值型別 方法名稱(引數列表){
    方法體
}

public interface xxx{
    
    public default void methodDefault1()
    {
        System.out.println("AAA");
        common();
    }
    
    public default void methodDefault1()
    {
        System.out.println("AAA");
        common();
    }
    
    private default void common()
    {
        System.out.println("CAA");
        System.out.println("BAA");
        System.out.println("DAA");
    }
}

//靜態私有,就把default換成static即可

六、介面常量定義和使用


介面中也可以定義成員變數,但是必須使用public static final三個關鍵字進行修飾
從效果上看,這其實就是介面的常量
格式:
public static final 資料型別 常量名稱 = 資料值 ;
備註:
一旦使用final關鍵字進行修飾,說明不可改變

1.介面當中的常量,可以省略public static final,注意,不寫也照樣是這樣
2.介面當中的常量,必須進行賦值,不能不賦值。

public interface xxx{

    //這其實就是一個常量,一旦賦值,不可以修改
    public static final int NUM = 10 ;

}

//訪問介面當中的常量
(介面名稱.常量名稱)
sys.out.println ====> xxx.NUM ;

七、Java介面interface的使用總結

在Java9+版本中,介面的內容可以有:
1.成員變數其實是常量,格式:
[public] [static] [final] 資料型別 常量名稱 = 資料值;
注意:
    常量必須進行賦值,而且一旦賦值不能改變。
    常量名稱完全大寫,用下劃線進行分隔

2.介面中最重要的就是抽象方法,格式:
[public] [abstract] 返回值型別 方法名稱(引數列表);
注意:實現類必須覆蓋重寫介面所有的抽象方法,除非實現類是抽象類。

3.從Java8開始,接口裡允許定義預設方法,格式:
[public] default 返回值型別 方法名稱(引數列表) {方法體}
注意:預設方法也可以被覆蓋重寫

4.從Java8開始,接口裡允許定義靜態方法,格式:
[public] static 返回值型別 方法名稱(引數列表) {方法體}

5.從Java9開始,接口裡允許定義私有方法,格式:
普通私有方法: private 返回值型別 方法名稱(引數列表) {方法體}
靜態私有方法:  private static 返回值型別 方法名稱(引數列表) {方法體}
注意:private的方法只有介面自己才能呼叫,不能被實現類或別人呼叫。

6.介面是沒有靜態程式碼塊或者構造方法的。

實現多個介面的格式:

public interface MyInterfaceA
{
	public abstract void xxxA();
}

public interface MyInterfaceB
{
	public abstract void xxxB();
}

public class MyInterfaceImple implements MyInterfaceA,MyInterfaceB {
	//覆蓋重寫所有抽象方法
	public void xxxA()
	{
	}
	
	public void xxxB()
	{
	}
}

7.一個類的直接父類是唯一的,但是一個類可以同時實現多個介面。

8.如果實現類所實現的多個介面當中,存在重複的抽象方法,那麼只需要覆蓋重寫一次即可。

9.如果類是沒有覆蓋重寫所有介面當中的所有抽象方法,那麼實現類就必須是一個抽象類。

10.如果實現類所實現的多個介面當中,存在重複的預設方法,那麼實現類一定要對衝突的預設方法進行覆蓋重寫。

11.一個類如果直接父類當中的方法和介面當中的預設方法產生了衝突,優先用父類的方法。

12.類與類之間是單繼承的。直接父類只有一個。類與介面之間是多實現的,一個類可以實現多個介面。

13.介面與介面之間是多繼承的。

public interface MyInterface extends MyInterfaceA,MyInterfaceB
{
	//需要定義介面MyInterface、MyInterfaceA、MyInterfaceB的抽象方法
	//以及各個介面之間的共有抽象方法
}

注意事項:
1.多個父介面當中的抽象方法如果重複,沒有關係。
2.多個父介面當中的預設方法如果重複,那麼子介面必須進行預設方法的覆蓋重寫,[而且帶著default關鍵字]。

案例一、使用者開啟USB介面的滑鼠

(1)設計USB介面

package test_interface;

public interface USB {
	public abstract void open(); 	//開啟usb裝置
	public abstract void close();   //關閉usb裝置
	public abstract void click(); 	//單擊
	public abstract void double_click();   //雙擊
}

如上程式碼所示,USB介面定義了四個功能,分別是開啟、關閉USB裝置。單擊和雙擊的功能,但具體是怎麼定義的,並不是具體的過程,所以它是抽象的,需要通過一個子類去實現它的介面。

(2)用一個子類去實現介面

package test_interface;

public class Mouse implements USB {

	@Override
	public void open() {
		// TODO Auto-generated method stub
		System.out.println("開啟滑鼠!");
	}

	@Override
	public void close() {
		// TODO Auto-generated method stub
		System.out.println("關閉滑鼠!");
	}
	
	public void click(){
		System.out.println("單擊滑鼠!");
	}
	
	public void double_click(){
		System.out.println("雙擊滑鼠!");
	}
}

滑鼠具有以下功能,分別是open,close,click和double_click,也就是具體描述了介面中定義的抽象方法的一個過程,定義了子類後,接下來就要來使用它,由於操作滑鼠需要開啟電腦,所以我們也要實現一個Computer類。

package test_interface;

public class Computer {
	
	public void power_on()
	{
		System.out.println("開啟電源!");
	}
	
	public void power_off()
	{
		System.out.println("關閉電源!");
	}
	
	public void use_Device(USB usb)
	{
		//開啟usb裝置
		usb.open();
		//如果當前的usb裝置是Mouse類,則呼叫click和double_click方法。
		if(usb instanceof Mouse)
		{
			usb.click();
			usb.double_click();
		}
		//關閉usb裝置
		usb.close();
	}
	
}

(3)使用介面

首先開啟電腦電源,接下來開啟滑鼠,實現單擊、雙擊,關閉滑鼠,最後關閉電源。

package test_interface;

public class User {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Computer user = new Computer();
		user.power_on();
		//開啟滑鼠							//非多型寫法
		Mouse mouse = new Mouse();
		user.use_Device(mouse);
		//關閉滑鼠
		user.power_off();
	}

}

執行結果:

 

 

 

參考資料:傳智播客Java學習