Java基礎——介面
介面
- 介面是一種抽象型別,關鍵字interface,是抽象方法的集合。
- 介面不能例項化,可以被實現。
- 介面中的方法都是抽象方法(預設public abstract ),沒有構造方法。沒有成員變數,預設都是靜態常量(預設public static final)。
- 一個類通過關鍵字implements實現介面,介面中定義的所有抽象方法必須實現。但是,抽象類就不強制要求必須實現介面的抽象方法。
- 介面可以繼承介面,而且不同於類的是可以多繼承,格式:A extends B,C…
示例程式碼體會: 程式碼通過標記介面分類,並通過不同的繼承和實現效果,按照優先順序展示結果。
@1. 主要定義了6個介面,其中包含標記介面、介面多繼承、定義抽象方法、定義靜態常量效果。 @1.1 Animal.java、Humans.java、Others.java可以作為頂層標記介面,分別標記了動物、人類、未知三個種類。
什麼是標記介面?我們在程式設計時可以通過定義沒有方法和變數的空介面,作為一個抽象型別標記,為繼承它的介面或實現它的類標記一個型別,思考下這有什麼意義呢?
/**
* @Description : 標記介面(沒有定義函式或變數)
*/
public interface Animal {
}
public interface Humans {
}
public interface Others {
}
@1.2 Beneficial.java、Pests.java作為二級介面,繼承了Animail.java介面(意味著它們被標記為Animail),並分別定義了各自的抽象方法和靜態常量。
為什麼介面中的方法必須是公開抽象的?變數必須是公開靜態常量? public當然是為了它的實現類能夠呼叫。 抽象方法是介面的特性,介面只能定義抽象方法,不能具體實現,只能由實現類來完成。 static final,因為介面不能例項化,所以必須靜態載入,而final自然是為了保證值不變。
/** * @Description : 介面可以繼承介面,定義抽象方法和靜態常量。 */ public interface Beneficial extends Animal { public static final String BENE_PRO_VALUE = "useful"; public abstract String getBeneProValue(); }
/**
* @Description : 介面可以繼承介面,定義抽象方法和靜態常量。
*/
public interface Pests extends Animal {
public static final String PESTS_PRO_VALUE = "harm";
public abstract String getPestsProValue();
}
@1.3 Godzilla.java展示了多繼承效果。GodzillaImpl.java是實現類,可以發現實現類必須實現自身及父介面的所有抽象方法。
/**
* @Description : 介面可以繼承一個或多個介面。
*/
public interface Godzilla extends Beneficial,Pests {
}
/**
* @Description : 一個類實現介面時,如果介面繼承了其它一個或多個介面時,應實現所有介面的抽象方法。
*/
public class GodzillaImpl implements Godzilla {
private static final String GODZILLAIMPL_VALUE = "godzilla";
@Override
public String getBeneProValue() {
return BENE_PRO_VALUE;
}
@Override
public String getPestsProValue() {
return PESTS_PRO_VALUE;
}
private String getGodzillaimplValue(){
return GODZILLAIMPL_VALUE+"&"+BENE_PRO_VALUE+"&"+PESTS_PRO_VALUE;
}
}
@2. 實現類 @2.1 Droy.java 實現了Humans.java介面。
/**
* @Description :
*/
public class Droy implements Humans {
private static final String DROY_NAME = "Droy Zhou";
private String getDroyName(){
return DROY_NAME;
}
}
@2.2 Et.java實現了Others.java介面。
/**
* @Description :
*/
public class Et implements Others {
private static final String ET_VALUE = "et";
private String getEtValue(){
return ET_VALUE;
}
}
@2.3 Frog.java 實現了Beneficial.java介面。
/**
* @Description :
*/
public class Frog implements Beneficial {
private static final String FROG_VALUE = "frog";
@Override
public String getBeneProValue() {
return BENE_PRO_VALUE;
}
private String getFrogValue(){
return FROG_VALUE+"&"+BENE_PRO_VALUE;
}
}
@2.4 Locust.java 實現了Pests.java介面。
/**
* @Description :
*/
public class Locust implements Pests {
private static final String LOCUST_VALUE = "locust";
@Override
public String getPestsProValue() {
return PESTS_PRO_VALUE;
}
private String getLocustValue(){
return LOCUST_VALUE+PESTS_PRO_VALUE;
}
}
@2.5 Sparrow.java直接實現了標記介面Animal.java。
/**
* @Description :
*/
public class Sparrow implements Animal {
private static final String SPARROW_VALUE = "sparrow";
private String getSparrowValue(){
return SPARROW_VALUE;
}
}
@2.6 Monster.java實現了多個介面效果,這樣它必須實現所有介面的抽象方法。
/**
* @Description : 一個類可以同時實現多個介面,而且必須實現每一個介面的抽象方法。
*/
public class Monster implements Animal,Beneficial,Pests,Humans,Others {
private static final String MONSTER_VALUE = "monster";
@Override
public String getBeneProValue() {
return BENE_PRO_VALUE;
}
@Override
public String getPestsProValue() {
return PESTS_PRO_VALUE;
}
private String getMonsterValue(){
return MONSTER_VALUE+"&"+BENE_PRO_VALUE+"&"+PESTS_PRO_VALUE;
}
}
@3. 最後通過main體會介面的用法及效果。
/**
* @Description :
*/
public class InterFacesMain {
public static void main(String[] args) {
Object[] objects = new Object[]{new Droy(), new Frog(), new Locust(), new Sparrow(), new Et(), new GodzillaImpl()};
System.out.println("開始分析樣本:");
for (int i = 0; i < objects.length; i++) {
if (objects[i] instanceof Animal) {
if (objects[i] instanceof Godzilla) {
System.out.println(i + 1 + " 這是哥斯拉!");
} else if (objects[i] instanceof Beneficial) {
System.out.println(i + 1 + " 這是一隻益蟲!");
} else if (objects[i] instanceof Pests) {
System.out.println(i + 1 + " 這是一隻害蟲!");
} else {
System.out.println(i + 1 + " 這是一隻不好不壞的動物!");
}
} else if (objects[i] instanceof Humans) {
System.out.println(i + 1 + " 這是一個人類!");
} else {
System.out.println(i + 1 + " 這是一種未知物!");
}
}
}
}
輸入出結果:
開始分析樣本:
1 這是一個人類!
2 這是一隻益蟲!
3 這是一隻害蟲!
4 這是一隻不好不壞的動物!
5 這是一種未知物!
6 這是哥斯拉!
可以更改程式碼體驗更多效果幫助我們直觀的理解介面效果,體會它的意義。 點選下載>>>示例原始碼