Java面向物件基礎(介面)
什麼是介面
介面是多個類的公共規範,介面是一種引用資料型別,最重要的內容就是其中的抽象方法
介面是比抽象類更抽象的抽象類,規範了對子類的約束,全面專業的實現了規範和具體實現的分離
如何定義介面
public interface 介面名稱{ 介面內容 }
介面中的抽象方法如何定義
步驟:
1、新建一個java檔案,型別選做interface型別
2、在接口裡面寫抽象方法,在介面中的抽象方法,修飾符必須是固定的關鍵字:public abstract(這兩個關鍵字可以選擇性刪除掉)
使用步驟:
1、介面不能直接使用,必須有一個實現類來實現該介面
格式:
2、介面的實現類必須覆蓋重寫(實現)介面中所有的抽象方法
格式:
重寫方法,去掉abstract關鍵字,加上方法體
3、建立實現類的物件,進行使用
介面中的預設方法如何定義
格式:
public default 返回值型別 方法名稱(引數列表){ 方法體 }
作用:
介面中預設方法的出現,目的是解決介面升級問題,當我們接口裡面寫好一個或幾個抽象方法後,實現類實現了該介面,功能正常實現了。當需要在介面中定義新的方法時,如果使用抽象方法,那麼實現介面類必須得全部重寫新的抽象方法,所以,我們為了減少程式碼的更改,可以使用預設方法
介面預設方法的使用
介面中的預設方法,預設被實現類繼承,實現類可直接呼叫。
在呼叫實現類的時候,如果實現類中沒有預設方法,會預設向上(介面中)查詢。
同時,介面的預設方法,也可以被實現類覆蓋重寫。
介面靜態方法的定義和使用
介面靜態方法的定義格式:
public static 返回值型別 方法名稱(引數列表){ 方法體}
呼叫的時候 介面名稱.靜態方法名();
注意:
不能通過介面實現類來呼叫介面中的靜態方法。因為一個實現類可實現多個介面,如果直接用實現類來呼叫靜態方法,後期可能會產生一定的衝突。
介面常量定義與使用
介面中也可以定義成員變數,但是必須使用public static final 三個關鍵字進行修飾,這就是介面中的“常量”
注意:
介面中的常量必須,也可以省略public static final
介面中的常量,必須進行賦值。
呼叫的時候,直接介面 名.變數名
繼承父類實現多個介面
1、介面中沒有靜態程式碼塊,也沒有構造方法
2、一個類的直接父類是唯一的,但是一個類同時可以實現多個介面,實現多個介面的時候,用逗號隔開。必須實現多個介面中的抽象方法。
格式:
public class 實現類 implements 介面1,介面2
3、如果實現類所實現的介面中出現方法重名的現象,只需重寫覆蓋一個方法即可。
4、如果實現類沒有實現所有介面的抽象方法,那麼該實現類就必須是抽象類
5、如果實現類所實現的多個介面中,存在相同的預設方法,那麼實現類一定要對衝突的預設方法覆蓋重寫
6、一個類直接父類的方法和其實現介面的方法衝突是,那麼父類優先。在java中,繼承優先於介面
介面的多繼承關係
1、類之間屬於單根繼承,只能有一個直接父類
2、類和介面之間,一個類可實現多個介面
3、介面與介面之間是多繼承的
格式:
public interface 介面1 entends 介面2,介面3{}
此時就是介面1繼承了介面2和介面3.
一個介面繼承多個介面時,如果抽象方法重複,沒有關係。如果預設方法重複,則子介面必須覆蓋重寫
介面練習
//CPU介面 方法獲得CPU型別
public interface Cpu {
public abstract String getCpu();
}
//硬碟介面
public interface Hdd {
public abstract String getHdd();
}
//記憶體介面
public interface Ram {
public abstract String getRam();
}
public class Factory implements Cpu,Hdd,Ram {
@Override
public String getCpu() {
return "Inter I7";
}
@Override
public String getHdd() {
return "金士頓 500G";
}
@Override
public String getRam() {
return "8G運存";
}
}
public class Computer {
//電腦具備屬性
public String ram;
public String hdd;
public String cpu;
public String getRam() {
return ram;
}
public void setRam(String ram) {
this.ram = ram;
}
public String getHdd() {
return hdd;
}
public void setHdd(String hdd) {
this.hdd = hdd;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public void show(){
System.out.println("品牌資訊如下");
System.out.println("CPu品牌"+this.cpu);
System.out.println("硬碟資訊"+this.hdd);
System.out.println("執行記憶體"+this.ram);
}
}
public class TestComputer {
public static void main(String[] args) {
Computer computer = new Computer();
Factory factory = new Factory();
computer.setCpu(factory.getCpu());
computer.setHdd(factory.getHdd());
computer.setRam(factory.getRam());
computer.show();
}
}
結果展示: