java編程思想讀書筆記 第九章 接口

1、抽象類和抽象方法

創建抽象類是希望通過這個通用接口操縱一系列類。如果一個類包含大於等於一個抽象方法,那麼這個類就是抽象類,必須用abstract關鍵字來限定這個抽象類。
如果試圖直接創建該抽象類的對象,編譯器會報錯。
如果抽象類的子類沒有爲基類的抽象方法提供定義,那麼這個導出類依舊是抽象類。
抽象類也可以不包含任何抽象方法,單純的用abstract限定類。(該類不能產生對象)

2、接口
interface這個關鍵字替代class關鍵字,產生了一個完全抽象的類。接口只提供形式,未提供任何具體實現。
接口被用了建立類與類之間的協議。接口也可以包含域,但是這些域隱式的是static和final的。因此,其中定義的成員變量,是static&final的。
implenments關鍵字可以跟一組接口,extends關鍵字只能跟一個基類。
接口中的方法必須是public的,隱式的被聲明public的,如果要顯示聲明,它們也必須被聲明爲public的。否則在繼承的過程中,可訪問權限被降低,這是java編譯器所不允許的。

3、完全解耦
策略設計模式:創建一個能夠根據傳遞參數對象不同而具有不同行爲的方法。比如:

class Processor {
public String name() {
return getClass().getSimpleName();
}
Object process(Object input) { return input; }
}
class Upcase extends Processor {
String process(Object input) { // Covariant return
return ((String)input).toUpperCase();
}
}
class Downcase extends Processor {
String process(Object input) {
return ((String)input).toLowerCase();
}
}
class Splitter extends Processor {
String process(Object input) {
// The split() argument divides a String into pieces:
return Arrays.toString(((String)input).split(” “));
}
}
public class Apply {
public static void process(Processor p, Object s) {
System.out.print(“Using Processor ” + p.name());
System.out.print(p.process(s));
}
public static String s =
“Disagreement with beliefs is by definition incorrect”;
public static void main(String[] args) {
process(new Upcase(), s);
process(new Downcase(), s);
process(new Splitter(), s);
}
}

4、java中的多重繼承
java沒有任何與接口相關的存儲,因此可以繼承任意多個接口。\
使用接口的核心原因:爲了能夠向上轉型爲多個基本類型。順帶可以防止客戶端程序員創建該類的對象。

5、通過繼承擴展接口
extends只能用於單一類,但是接口繼承時卻可以引用多個接口,用逗號分開。
interface Interface1 extends Interface2,Interface3{}
接口無法用implements來實現別的接口,必須用extends。
應該儘量避免組合的多個接口中包含相同方法名,這樣會造成代碼可讀性的混亂。
第九章6-10小節的內容
6、適配接口
接口最吸引人的原因之一就是允許同一個接口具有多個不同的具體實現。在簡單的情況中,它的提現形式通常是一個接受接口類型的方法,而該接口的實現和該方法的傳遞的對象則取決於方法的使用者。
7、接口中的域
因爲你放入接口中的任何域都自動是static和final的,所以接口就成爲了一種很便捷的用來創建常量組的工具。請注意,java中標識具有常量初始化值的static、final是,會使用大寫字母的風格(在一個標識符中用下劃線來分隔多個單詞)。接口中的域自動是public的,所以顯式地指明這點。
(1)在接口中定義的域不能是“空final”,但是可以被非常量表達式初始化。例如:在接口中這樣定義int RANDOM_INT = RAND.nextInt(10);
域是static的,他媽就可以在類第一次初始化被加載時初始化,這發生在任何域首次被訪問時。注意:這些域不是接口的一部分,它們的值被存儲在該接口的靜態存儲域。

8、嵌套接口
接口可以嵌套在類或其他接口中。在類中嵌套接口的語法是相當顯而遇見的,就像非嵌套接口一樣,可以擁有public和“包訪問”兩種可視性。注意,當實現某個接口時,並不需要實現嵌套在其內部的任何接口。而且,private接口不能在定義它的類之外被實現。

9、接口與工廠
接口時實現多繼承的途徑,而生成遵循某個接口的對象的典型方式就是工廠方法設計模式。這與直接調用構造器不同,我們在工廠對象上調用的是創建方法,而該工廠對象將生產接口的某個實現的對象。理論上,通過這種方式,我們的代碼將完全與接口的實現分離,這就使得我們可以透明地將某個實現替換爲另一個實現。例子 如下:
public interface Service {
void method1();
void method2();
}

public interface ServiceFactory{
Service getService();
}
public class Implementionl implements Service{

@Override
public void method1() {
    System.out.println("Implementionl method1");
}
@Override
public void method2() {
    System.out.println("Implementionl method2");
}

}
public class Implemention1Factory implements ServiceFactory{

@Override
public Service getService() {
    // TODO Auto-generated method stub
    return new Implementionl();
}

}
public class Implemention2 implements Service{

@Override
public void method1() {
    System.out.println("Implemention2 method1");
}
@Override
public void method2() {
    System.out.println("Implemention2 method2");

}

}
public class Implemention2Factory implements ServiceFactory{

@Override
public Service getService() {
    return new Implemention2();
}

}
public class Factories {
public static void serviceConsumer(ServiceFactory factory) {
Service service = factory.getService();
service.method1();
service.method2();
}
public static void main(String[] args) {
serviceConsumer(new Implemention1Factory());
serviceConsumer(new Implemention2Factory());

}

}
在這個例子中,如果不是使用工廠方法,這些代碼就必須在某處指定將要創建的Service的確切類型,以便調用合適的構造器。

10、總結
在做代碼設計的時候,恰當的原則是優先選擇類而不是接口。接口是一種重要的工具,但是我們在實際應用的過程中,不能濫用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章