摘要:具體而言就是高層模塊不依賴于底層模塊,二者都同依賴于抽象抽象不依賴于具體,具體依賴于抽象。
9.接口 9.1 抽象類和抽象方法
抽象類:包含抽象方法的類,自身無法實例化
抽象方法:僅有聲明,沒有方法體
關系:抽象方法是抽象類的充分不必要條件,因此抽象類中允許方法實現和抽象方法同時存在
語法
// 抽象類 abstract class ClassName{} // 抽象方法 abstract void f()
注意點
抽象類中接入接口,則繼承抽象類的導出類同樣需要實現接口
9.2 接口接口:完全抽象的類
規則
使用interface關鍵字來替代class
訪問修飾符只允許public或者默認的包訪問權限
只允許方法名、參數列表、返回類型
方法類型默認固定是public
接口可以指向實現該接口的對象
用途
建立類與類之間的聯系
9.2.1 接口和抽象類的使用原因——重點抽象類是抽象若干個類的共同點并用來繼承,接口是在導出類中增加導出類需要的特殊方法1.問答
使用接口和抽象類的原因
依賴倒置原則(Dependecy-Inversion Principle):依賴于抽象。具體而言就是高層模塊不依賴于底層模塊,二者都同依賴于抽象;抽象不依賴于具體,具體依賴于抽象。
實現多態,能夠向上轉型
防止客戶端程序員創建該類的對象
使用接口或抽象類的原因
接口
降低程序模塊的耦合
需要實現的方法不是基類必要屬性
作為單繼承的補充
抽象類
復用
接口和抽象類的異同
9.3 完全解耦 1.策略設計模式定義:一個能夠根據傳遞的參數對象的不同而具有不同行為的方法。
策略:傳入的參數對象
2.適配器設計模式定義:通過適配器類將接受接口,并返回需要的接口
分類:類的適配器、對象的適配器
3.類的適配器目的:將接口從具體實現中解耦,使得接口可以應用于多種不同的具體表現
原理:如果有220V和110V電源兩個(被適配對象),手機需要充電(需要實現的功能),這時候需要充電器(適配器),手機的充電方法傳入參數為接口對象,原因是實現該接口的類都能作為參數傳入(多態的運用)
實現
public class Adaptee220V { int output220V(){ return 220;}} public class Adaptee110V { int output110V(){ return 110;}}
public class Adapter220V extends Adaptee220V implements Target { @Override public int output5V() { int v = super.output220V(); // 將電壓進行轉換的具體實現 int dst = v / 44; return dst; } } public class Adapter110V extends Adaptee110V implements Target { @Override public int output5V() { int v = super.output110V(); int dst = v / 22; return dst; } }
public interface Target { int output5V(); }
public class Phone { // 充電方法,充電需要用到供電方法 void charging(Target target){ int v = target.output5V(); System.out.println("使用成功,方法為"+target.getClass().getSimpleName()+",電壓為:"+v); } }
public class TestAdapter { public static void main(String[] args) { new Phone().charging(new Adapter220V()); new Phone().charging(new Adapter110V()); } }9.4 Java中的多重繼承
多重繼承:組合多個接口,因為Java是單繼承
注意點:
當基類方法和接口方法的特征簽名(方法的名稱、參數順序以及參數類型)一樣時,導出類優先實現基類方法
9.5 通過繼承來擴展接口
擴展接口方法
接口中implements接口
接口使用extends引用多個基類接口;原因:類多重繼承時,如果被繼承類中存在相同方法則無法判斷調用方法。接口允許多重繼承,因為都是抽象方法
// 繼承多個接口的接口 public interface Human extends CanJump,CanRun,CanSay { void CanSleep(); } public interface CanJump { void jump(); void fastJump(); } public interface CanRun { void run(); void fastRun(); } public interface CanSay { void say(); void fastSay(); }9.5.1 組合接口時的名字沖突
避免使用不同接口中使用相同的方法名9.6 適配接口 9.7 接口中的域
接口中的任何域都是自動static,final,public9.7.1 初始化接口中的域因此在java SE5之前存在使用接口域創建enum類型的變量
規則
不能是空final
可以是非常量表達式
9.8 嵌套接口
規則
接口中可以嵌套在類或者其他接口中
接口中的元素都必須是public,不能聲明為private,因此接口嵌套在接口中,嵌套的接口必須為public
類中嵌套接口,接口可以是private類型
實現
class A { private interface D{ void f(); }; private class DImp implements D{ @Override public void f() {}; } public class DImp2 implements D{ @Override public void f(){}; } }
interface A{ // 接口默認是abstract,不能是private,因為接口中元素只能是public //public abstract interface B{ interface B{ public static final int num = 50; }
interface C{ class D{ } }9.9 接口與工廠 1.工廠方法設計模式
原理:在工廠對象上調用類的創建方法,該工廠對象生成接口的某個實現的對象,并且可以使用多態
實現
// 接口 public interface Game { void play(); } // 工廠接口 public interface GameFactory { Game getGame(); }
?
// 硬幣游戲類 class CoinGame implements Game{ @Override public void play() { System.out.println("This is coin game"); } } // 骰子游戲類 public class DiceGame implements Game{ @Override public void play() { System.out.println("This is dice game"); } } // 工廠類 public class GameFactoryCoin implements GameFactory { @Override public Game getGame() { return new CoinGame(); } } public class GameFactoryDice implements GameFactory { @Override public Game getGame() { return new DiceGame(); } }
public class Test19 { // 傳入工廠對象 static void playGame(GameFactory gameFactory){ Game game = gameFactory.getGame(); game.play(); } public static void main(String[] args) { playGame(new GameFactoryCoin()); playGame(new GameFactoryDice()); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75647.html
摘要:基類導出類導出類繼承了基類的特點,基類和導出類具有相同的基礎接口,形成兩者差異的做法在導出類中添加新方法在導出類型中添加新的接口元素,擴展了接口。覆蓋在導出類用創建方法的新定義,覆蓋基類中的方法定義純粹替代,只覆蓋。 一、抽象過程 建模基于計算機的結構 解空間的解 匯編語言:對底層機器的輕微抽象 命令式語言:匯編語言的抽象 建模基于待解決問題 問題空間的元素 面向對象 二、每個...
摘要:找到字節碼并創建一個對象。鏈接,檢驗字節碼,為字段分配存儲空間,解決其對他類的引用。初始化,如果有父類則初始化父類,執行靜態初始化器和靜態初始化區塊直到第一次訪問靜態成員時初始化才執行。如果成員不是編譯時常量由初始化器賦值,也會引起初始化。 有兩種形式在運行時獲取類型信息: 傳統的RTTI 反射 Class對象 運行時的類型信息是通過Class對象表現的,它包含了類的信息。所有...
摘要:但如果導出類還有抽象方法,那這個類還應該加上聲明為抽象類。并且接口具有繼承的一系列特點,如向上轉型等等。接口中的方法是自動是的。 Thinking in Java 好書全是干貨 一、抽象類和抽象方法 抽象方法:這種方法只有聲明而沒有方法體,下面是抽象方法生命所采用的語法 abstract void f(); 包含抽象方法的類叫做抽象類,如果一個類包含一個或多個抽象方法,該類必須被限定為...
摘要:基于版本基于版本。由于中英行文差異,完全的逐字逐句翻譯會很冗余啰嗦。譯者在翻譯中同時參考了谷歌百度有道翻譯的譯文以及編程思想第四版中文版的部分內容對其翻譯死板,生造名詞,語言精煉度差問題進行規避和改正。 來源:LingCoder/OnJava8 主譯: LingCoder 參譯: LortSir 校對:nickChenyx E-mail: 本書原作者為 [美] Bru...
摘要:內部類中也可以取得這個外部類對象引用。創建成員內部類對象的時候需要外部類對象。另外在方法中的內部類不能加等權限修飾符,只能加和修飾符。可以在接口內部定義內部類,而且他們即使沒有修飾,也會自動變成的。 Thinking in Java撈干貨,寫筆記 一、成員內部類 1.最基本使用 public class Demo { class Contents{ privat...
閱讀 1867·2023-04-25 19:51
閱讀 1168·2021-11-15 11:43
閱讀 4529·2021-11-02 14:40
閱讀 1999·2021-10-11 10:59
閱讀 1338·2021-09-22 15:05
閱讀 1027·2021-09-09 09:32
閱讀 648·2019-08-30 15:56
閱讀 549·2019-08-30 15:52