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學習