摘要:具體而言就是高層模塊不依賴于底層模塊,二者都同依賴于抽象抽象不依賴于具體,具體依賴于抽象。
9.接口 9.1 抽象類和抽象方法
抽象類:包含抽象方法的類,自身無(wú)法實(shí)例化
抽象方法:僅有聲明,沒(méi)有方法體
關(guān)系:抽象方法是抽象類的充分不必要條件,因此抽象類中允許方法實(shí)現(xiàn)和抽象方法同時(shí)存在
語(yǔ)法
// 抽象類 abstract class ClassName{} // 抽象方法 abstract void f()
注意點(diǎn)
抽象類中接入接口,則繼承抽象類的導(dǎo)出類同樣需要實(shí)現(xiàn)接口
9.2 接口接口:完全抽象的類
規(guī)則
使用interface關(guān)鍵字來(lái)替代class
訪問(wèn)修飾符只允許public或者默認(rèn)的包訪問(wèn)權(quán)限
只允許方法名、參數(shù)列表、返回類型
方法類型默認(rèn)固定是public
接口可以指向?qū)崿F(xiàn)該接口的對(duì)象
用途
建立類與類之間的聯(lián)系
9.2.1 接口和抽象類的使用原因——重點(diǎn)抽象類是抽象若干個(gè)類的共同點(diǎn)并用來(lái)繼承,接口是在導(dǎo)出類中增加導(dǎo)出類需要的特殊方法1.問(wèn)答
使用接口和抽象類的原因
依賴倒置原則(Dependecy-Inversion Principle):依賴于抽象。具體而言就是高層模塊不依賴于底層模塊,二者都同依賴于抽象;抽象不依賴于具體,具體依賴于抽象。
實(shí)現(xiàn)多態(tài),能夠向上轉(zhuǎn)型
防止客戶端程序員創(chuàng)建該類的對(duì)象
使用接口或抽象類的原因
接口
降低程序模塊的耦合
需要實(shí)現(xiàn)的方法不是基類必要屬性
作為單繼承的補(bǔ)充
抽象類
復(fù)用
接口和抽象類的異同
9.3 完全解耦 1.策略設(shè)計(jì)模式定義:一個(gè)能夠根據(jù)傳遞的參數(shù)對(duì)象的不同而具有不同行為的方法。
策略:傳入的參數(shù)對(duì)象
2.適配器設(shè)計(jì)模式定義:通過(guò)適配器類將接受接口,并返回需要的接口
分類:類的適配器、對(duì)象的適配器
3.類的適配器目的:將接口從具體實(shí)現(xiàn)中解耦,使得接口可以應(yīng)用于多種不同的具體表現(xiàn)
原理:如果有220V和110V電源兩個(gè)(被適配對(duì)象),手機(jī)需要充電(需要實(shí)現(xiàn)的功能),這時(shí)候需要充電器(適配器),手機(jī)的充電方法傳入?yún)?shù)為接口對(duì)象,原因是實(shí)現(xiàn)該接口的類都能作為參數(shù)傳入(多態(tài)的運(yùn)用)
實(shí)現(xiàn)
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(); // 將電壓進(jìn)行轉(zhuǎn)換的具體實(shí)現(xiàn) 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中的多重繼承
多重繼承:組合多個(gè)接口,因?yàn)镴ava是單繼承
注意點(diǎn):
當(dāng)基類方法和接口方法的特征簽名(方法的名稱、參數(shù)順序以及參數(shù)類型)一樣時(shí),導(dǎo)出類優(yōu)先實(shí)現(xiàn)基類方法
9.5 通過(guò)繼承來(lái)擴(kuò)展接口
擴(kuò)展接口方法
接口中implements接口
接口使用extends引用多個(gè)基類接口;原因:類多重繼承時(shí),如果被繼承類中存在相同方法則無(wú)法判斷調(diào)用方法。接口允許多重繼承,因?yàn)槎际浅橄蠓椒?/p>
// 繼承多個(gè)接口的接口 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 組合接口時(shí)的名字沖突
避免使用不同接口中使用相同的方法名9.6 適配接口 9.7 接口中的域
接口中的任何域都是自動(dòng)static,final,public9.7.1 初始化接口中的域因此在java SE5之前存在使用接口域創(chuàng)建enum類型的變量
規(guī)則
不能是空f(shuō)inal
可以是非常量表達(dá)式
9.8 嵌套接口
規(guī)則
接口中可以嵌套在類或者其他接口中
接口中的元素都必須是public,不能聲明為private,因此接口嵌套在接口中,嵌套的接口必須為public
類中嵌套接口,接口可以是private類型
實(shí)現(xiàn)
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{ // 接口默認(rèn)是abstract,不能是private,因?yàn)榻涌谥性刂荒苁莗ublic //public abstract interface B{ interface B{ public static final int num = 50; }
interface C{ class D{ } }9.9 接口與工廠 1.工廠方法設(shè)計(jì)模式
原理:在工廠對(duì)象上調(diào)用類的創(chuàng)建方法,該工廠對(duì)象生成接口的某個(gè)實(shí)現(xiàn)的對(duì)象,并且可以使用多態(tài)
實(shí)現(xiàn)
// 接口 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 { // 傳入工廠對(duì)象 static void playGame(GameFactory gameFactory){ Game game = gameFactory.getGame(); game.play(); } public static void main(String[] args) { playGame(new GameFactoryCoin()); playGame(new GameFactoryDice()); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75647.html
摘要:基類導(dǎo)出類導(dǎo)出類繼承了基類的特點(diǎn),基類和導(dǎo)出類具有相同的基礎(chǔ)接口,形成兩者差異的做法在導(dǎo)出類中添加新方法在導(dǎo)出類型中添加新的接口元素,擴(kuò)展了接口。覆蓋在導(dǎo)出類用創(chuàng)建方法的新定義,覆蓋基類中的方法定義純粹替代,只覆蓋。 一、抽象過(guò)程 建?;谟?jì)算機(jī)的結(jié)構(gòu) 解空間的解 匯編語(yǔ)言:對(duì)底層機(jī)器的輕微抽象 命令式語(yǔ)言:匯編語(yǔ)言的抽象 建模基于待解決問(wèn)題 問(wèn)題空間的元素 面向?qū)ο? 二、每個(gè)...
摘要:找到字節(jié)碼并創(chuàng)建一個(gè)對(duì)象。鏈接,檢驗(yàn)字節(jié)碼,為字段分配存儲(chǔ)空間,解決其對(duì)他類的引用。初始化,如果有父類則初始化父類,執(zhí)行靜態(tài)初始化器和靜態(tài)初始化區(qū)塊直到第一次訪問(wèn)靜態(tài)成員時(shí)初始化才執(zhí)行。如果成員不是編譯時(shí)常量由初始化器賦值,也會(huì)引起初始化。 有兩種形式在運(yùn)行時(shí)獲取類型信息: 傳統(tǒng)的RTTI 反射 Class對(duì)象 運(yùn)行時(shí)的類型信息是通過(guò)Class對(duì)象表現(xiàn)的,它包含了類的信息。所有...
摘要:但如果導(dǎo)出類還有抽象方法,那這個(gè)類還應(yīng)該加上聲明為抽象類。并且接口具有繼承的一系列特點(diǎn),如向上轉(zhuǎn)型等等。接口中的方法是自動(dòng)是的。 Thinking in Java 好書(shū)全是干貨 一、抽象類和抽象方法 抽象方法:這種方法只有聲明而沒(méi)有方法體,下面是抽象方法生命所采用的語(yǔ)法 abstract void f(); 包含抽象方法的類叫做抽象類,如果一個(gè)類包含一個(gè)或多個(gè)抽象方法,該類必須被限定為...
摘要:基于版本基于版本。由于中英行文差異,完全的逐字逐句翻譯會(huì)很冗余啰嗦。譯者在翻譯中同時(shí)參考了谷歌百度有道翻譯的譯文以及編程思想第四版中文版的部分內(nèi)容對(duì)其翻譯死板,生造名詞,語(yǔ)言精煉度差問(wèn)題進(jìn)行規(guī)避和改正。 來(lái)源:LingCoder/OnJava8 主譯: LingCoder 參譯: LortSir 校對(duì):nickChenyx E-mail: 本書(shū)原作者為 [美] Bru...
摘要:內(nèi)部類中也可以取得這個(gè)外部類對(duì)象引用。創(chuàng)建成員內(nèi)部類對(duì)象的時(shí)候需要外部類對(duì)象。另外在方法中的內(nèi)部類不能加等權(quán)限修飾符,只能加和修飾符??梢栽诮涌趦?nèi)部定義內(nèi)部類,而且他們即使沒(méi)有修飾,也會(huì)自動(dòng)變成的。 Thinking in Java撈干貨,寫(xiě)筆記 一、成員內(nèi)部類 1.最基本使用 public class Demo { class Contents{ privat...
閱讀 1879·2023-04-25 19:51
閱讀 1183·2021-11-15 11:43
閱讀 4546·2021-11-02 14:40
閱讀 2013·2021-10-11 10:59
閱讀 1351·2021-09-22 15:05
閱讀 1042·2021-09-09 09:32
閱讀 664·2019-08-30 15:56
閱讀 563·2019-08-30 15:52