介面 恰當的原則是優先使用類而不是介面。從類開始,如果使用介面的必要性變得很明確,那麼就重構。介面是一個偉大的工具,但它們容易被濫用。 介面中可添加靜態方法與預設方法 一個類實現一個介面的同時必須實現該介面的所有方法(可以不用實現預設方法即關鍵詞為為 default的方法) extends 只能用於 ...
介面
恰當的原則是優先使用類而不是介面。從類開始,如果使用介面的必要性變得很明確,那麼就重構。介面是一個偉大的工具,但它們容易被濫用。
- 介面中可添加靜態方法與預設方法
- 一個類實現一個介面的同時必須實現該介面的所有方法(可以不用實現預設方法即關鍵詞為為 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》