介面
恰當的原則是優先使用類而不是介面,從類開始,如果使用介面的必要性變得很明確,那么就重構,介面是一個偉大的工具,但它們容易被濫用,
- 介面中可添加靜態方法與默認方法
- 一個類實作一個介面的同時必須實作該介面的所有方法(可以不用實作默認方法即關鍵詞為為 default的方法)
- extends 只能用于單一類,但是在構建介面時可以參考多個基類介面,注意到,介面名之間用逗號分隔,
模板設計模式

把方法抽象封裝到介面或抽象類中,在別的類中對其進行實作即,變得是內容,而其框架則始終如一,
就像我與大廚炒西紅柿:大家都是加油、加雞蛋、加西紅柿,只是做出來時味道不同罷了,
介面與抽象類(選擇)
| 特性 | 介面 | 抽象類 |
|---|---|---|
| 組合 | 新類可以組合多個介面 | 只能繼承單一抽象類 |
| 狀態 | 不能包含屬性(除了靜態屬性,不支持物件狀態) | 可以包含屬性,非抽象方法可能參考這些屬性 |
| 默認方法 和 抽象方法 | 不需要在子類中實作默認方法,默認方法可以參考其他介面的方法 | 必須在子類中實作抽象方法 |
| 構造器 | 沒有構造器 | 可以有構造器 |
| 可見性 | 隱式 public | 可以是 protected 或友元 |
策略設計模式
- 創建一個能根據傳入的引數型別從而具備不同行為的方法稱為策略設計模式,
import java.util.*;
class Processor {
/*父類*/
public String name() {
return getClass().getSimpleName();
}
public Object process(Object input) {
return input;
}
}
/*子類開始,將所有傳入類設定為同一個類的子類*/
class Upcase extends Processor {
// 回傳協變型別
@Override
public String process(Object input) {
return ((String) input).toUpperCase();
}
}
class Downcase extends Processor {
@Override
public String process(Object input) {
return ((String) input).toLowerCase();
}
}
class Splitter extends Processor {
@Override
public String process(Object input) {
// split() divides a String into pieces:
return Arrays.toString(((String) input).split(" "));
}
}
/*策略開始*/
public class Applicator {
public static void apply(Processor p, Object s) {
//(Processor p,已知:所有傳入類設定為同一個類的子類,故其父類的變數可以作為參考
System.out.println("Using Processor " + p.name());//獲取其類名
System.out.println(p.process(s));//根據其類名呼叫其覆寫的相應的process方法
}
public static void main(String[] args) {
String s = "We are such stuff as dreams are made on";
//進入策略,以下3類均為Processor子類,故可用Processor p分別參考以下3個不同型別的物件
apply(new Upcase(), s);
apply(new Downcase(), s);
apply(new Splitter(), s);
}
}
常量欄位
介面中的欄位都自動是 static 和 final
public interface Months {
int
JANUARY = 1, FEBRUARY = 2, MARCH = 3,
APRIL = 4, MAY = 5, JUNE = 6, JULY = 7,
AUGUST = 8, SEPTEMBER = 9, OCTOBER = 10,
NOVEMBER = 11, DECEMBER = 12;
}
注:以上代碼除中文注釋外均來自《on java 8》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/154812.html
標籤:Java
下一篇:Maven(二) 構建生命周期
