1、接口 2、多态
01接口的概念
* A:接口的概念接口是功能的集合,同樣可看做是一種數(shù)據(jù)類型,是比抽象類更為抽象的”類”。接口只描述所應(yīng)該具備的方法,并沒(méi)有具體實(shí)現(xiàn),具體的實(shí)現(xiàn)由接口的實(shí)現(xiàn)類(相當(dāng)于接口的子類)來(lái)完成。這樣將功能的定義與實(shí)現(xiàn)分離,優(yōu)化了程序設(shè)計(jì)。請(qǐng)記住:一切事物均有功能,即一切事物均有接口。02接口的定義
* A: 接口的定義與定義類的class不同,接口定義時(shí)需要使用interface關(guān)鍵字。定義接口所在的仍為.java文件,雖然聲明時(shí)使用的為interface關(guān)鍵字的編譯后仍然會(huì)產(chǎn)生.class文件。這點(diǎn)可以讓我們將接口看做是一種只包含了功能聲明的特殊類。* B : 定義格式public interface 接口名 {抽象方法1;抽象方法2;抽象方法3;} * C: 定義步驟使用interface代替了原來(lái)的class,其他步驟與定義類相同:接口中的方法均為公共訪問(wèn)的抽象方法接口中無(wú)法定義普通的成員變量03接口的實(shí)現(xiàn)類
* A: 類與接口的關(guān)系類與接口的關(guān)系為實(shí)現(xiàn)關(guān)系,即類實(shí)現(xiàn)接口。實(shí)現(xiàn)的動(dòng)作類似繼承,只是關(guān)鍵字不同,實(shí)現(xiàn)使用implements。其他類(實(shí)現(xiàn)類)實(shí)現(xiàn)接口后,就相當(dāng)于聲明:”我應(yīng)該具備這個(gè)接口中的功能”。實(shí)現(xiàn)類仍然需要重寫(xiě)方法以實(shí)現(xiàn)具體的功能。 * B: 類實(shí)現(xiàn)接口的格式class 類 implements 接口 {重寫(xiě)接口中方法} * C:注意事項(xiàng)在類實(shí)現(xiàn)接口后,該類就會(huì)將接口中的抽象方法繼承過(guò)來(lái),此時(shí)該類需要重寫(xiě)該抽象方法,完成具體的邏輯。接口中定義功能,當(dāng)需要具有該功能時(shí),可以讓類實(shí)現(xiàn)該接口,只聲明了應(yīng)該具備該方法,是功能的聲明。在具體實(shí)現(xiàn)類中重寫(xiě)方法,實(shí)現(xiàn)功能,是方法的具體實(shí)現(xiàn)。04接口中成員變量的特點(diǎn)
* A:成員變量特點(diǎn)* a 接口中可以定義變量,但是變量必須有固定的修飾符修飾,public static final 所以接口中的變量也稱之為常量,其值不能改變。后面我們會(huì)講解static與final關(guān)鍵字* B:案例interface Demo { ///定義一個(gè)名稱為Demo的接口。public static final int NUM = 3;// NUM的值不能改變}05接口中成員方法的特點(diǎn)
* A: 成員方法特點(diǎn)* a 接口中可以定義方法,方法也有固定的修飾符,public abstract* b 子類必須覆蓋掉接口中所有的抽象方法后,子類才可以實(shí)例化。否則子類是一個(gè)抽象類。* B: 案例interface Demo { ///定義一個(gè)名稱為Demo的接口。public abstract void show1();public abstract void show2();}//定義子類去覆蓋接口中的方法。類與接口之間的關(guān)系是 實(shí)現(xiàn)。通過(guò) 關(guān)鍵字 implementsclass DemoImpl implements Demo { //子類實(shí)現(xiàn)Demo接口。//重寫(xiě)接口中的方法。public void show1(){}public void show2(){}}06實(shí)現(xiàn)類還是一個(gè)抽象類
A: 接口的實(shí)現(xiàn)類一個(gè)類如果實(shí)現(xiàn)類接口,有兩種操作方法:第一:實(shí)現(xiàn)類是非抽象類,就需要重寫(xiě)接口中所有的抽象方法.第二:實(shí)現(xiàn)類也聲明為抽象類,那么實(shí)現(xiàn)類可以不重寫(xiě)接口中的抽象方法。==============================第二節(jié)課開(kāi)始====================================
07類和接口的多實(shí)現(xiàn)
* A:接口的多實(shí)現(xiàn)了解了接口的特點(diǎn)后,那么想想為什么要定義接口,使用抽象類描述也沒(méi)有問(wèn)題,接口到底有啥用呢?接口最重要的體現(xiàn):解決多繼承的弊端。將多繼承這種機(jī)制在java中通過(guò)多實(shí)現(xiàn)完成了。* B 多實(shí)現(xiàn)的優(yōu)點(diǎn)* 怎么解決多繼承的弊端呢?* 弊端:多繼承時(shí),當(dāng)多個(gè)父類中有相同功能時(shí),子類調(diào)用會(huì)產(chǎn)生不確定性。* 其實(shí)核心原因就是在于多繼承父類中功能有主體,而導(dǎo)致調(diào)用運(yùn)行時(shí),不確定運(yùn)行哪個(gè)主體內(nèi)容。* 為什么多實(shí)現(xiàn)能解決了呢?* 因?yàn)榻涌谥械墓δ芏紱](méi)有方法體,由子類來(lái)明確。* C :案例演示interface Fu2{void show2();}class Zi implements Fu1,Fu2 { // 多實(shí)現(xiàn)。同時(shí)實(shí)現(xiàn)多個(gè)接口。public void show1(){}public void show2(){}}08類在繼承類的同時(shí)實(shí)現(xiàn)多接口
* A: 繼承的同時(shí)實(shí)現(xiàn)接口* 接口和類之間可以通過(guò)實(shí)現(xiàn)產(chǎn)生關(guān)系,同時(shí)也學(xué)習(xí)了類與類之間可以通過(guò)繼承產(chǎn)生關(guān)系。當(dāng)一個(gè)類已經(jīng)繼承了一個(gè)父類,它又需要擴(kuò)展額外的功能,這時(shí)接口就派上用場(chǎng)了。* 子類通過(guò)繼承父類擴(kuò)展功能,通過(guò)繼承擴(kuò)展的功能都是子類應(yīng)該具備的基礎(chǔ)功能。如果子類想要繼續(xù)擴(kuò)展其他類中的功能呢?這時(shí)通過(guò)實(shí)現(xiàn)接口來(lái)完成。* 接口的出現(xiàn)避免了單繼承的局限性。父類中定義的事物的基本功能。接口中定義的事物的擴(kuò)展功能。* B: 代碼演示class Fu {public void show(){}}interface Inter {pulbic abstract void show1();}class Zi extends Fu implements Inter {public void show1() {}}接口的出現(xiàn)避免了單繼承的局限性。父類中定義的事物的基本功能。接口中定義的事物的擴(kuò)展功能。09接口的多繼承
* A: 接口的多繼承* 學(xué)習(xí)類的時(shí)候,知道類與類之間可以通過(guò)繼承產(chǎn)生關(guān)系,接口和類之間可以通過(guò)實(shí)現(xiàn)產(chǎn)生關(guān)系,那么接口與接口之間會(huì)有什么關(guān)系。* 多個(gè)接口之間可以使用extends進(jìn)行繼承。* B 代碼演示interface Fu1{void show();}interface Fu2{void show1();}interface Fu3{void show2();}interface Zi extends Fu1,Fu2,Fu3{void show3();}在開(kāi)發(fā)中如果多個(gè)接口中存在相同方法,這時(shí)若有個(gè)類實(shí)現(xiàn)了這些接口,那么就要實(shí)現(xiàn)接口中的方法,由于接口中的方法是抽象方法,子類實(shí)現(xiàn)后也不會(huì)發(fā)生調(diào)用的不確定性。10接口思想
* A:接口的思想* 前面學(xué)習(xí)了接口的代碼體現(xiàn),現(xiàn)在來(lái)學(xué)習(xí)接口的思想,接下里從生活中的例子進(jìn)行說(shuō)明。* 舉例:我們都知道電腦上留有很多個(gè)插口,而這些插口可以插入相應(yīng)的設(shè)備,這些設(shè)備為什么能插在上面呢?* 主要原因是這些設(shè)備在生產(chǎn)的時(shí)候符合了這個(gè)插口的使用規(guī)則,否則將無(wú)法插入接口中,更無(wú)法使用。發(fā)現(xiàn)這個(gè)插口的出現(xiàn)讓我們使用更多的設(shè)備。* B: 接口的好處 * 總結(jié):接口在開(kāi)發(fā)中的它好處* 1、接口的出現(xiàn)擴(kuò)展了功能。* 2、接口其實(shí)就是暴漏出來(lái)的規(guī)則。* 3、接口的出現(xiàn)降低了耦合性,即設(shè)備與設(shè)備之間實(shí)現(xiàn)了解耦。* 接口的出現(xiàn)方便后期使用和維護(hù),一方是在使用接口(如電腦),一方在實(shí)現(xiàn)接口(插在插口上的設(shè)備)。例如:筆記本使用這個(gè)規(guī)則(接口),電腦外圍設(shè)備實(shí)現(xiàn)這個(gè)規(guī)則(接口)。11接口和抽象類的區(qū)別
* A: 明白了接口思想和接口的用法后,接口和抽象類的區(qū)別是什么呢?接口在生活體現(xiàn)也基本掌握,那在程序中接口是如何體現(xiàn)的呢?通過(guò)實(shí)例進(jìn)行分析和代碼演示抽象類和接口的用法。 * B: 舉例:* 犬:行為:吼叫;吃飯;* 緝毒犬:行為:吼叫;吃飯;緝毒;* C:思考:* 由于犬分為很多種類,他們吼叫和吃飯的方式不一樣,在描述的時(shí)候不能具體化,也就是吼叫和吃飯的行為不能明確。* 當(dāng)描述行為時(shí),行為的具體動(dòng)作不能明確,這時(shí),可以將這個(gè)行為寫(xiě)為抽象行為,那么這個(gè)類也就是抽象類。* 可是當(dāng)緝毒犬有其他額外功能時(shí),而這個(gè)功能并不在這個(gè)事物的體系中。這時(shí)可以讓緝毒犬具備犬科自身特點(diǎn)的同時(shí)也有其他額外功能,可以將這個(gè)額外功能定義接口中。* D: 代碼演示interface 緝毒{public abstract void 緝毒();}//定義犬科的這個(gè)提醒的共性功能abstract class 犬科{public abstract void 吃飯();public abstract void 吼叫();}// 緝毒犬屬于犬科一種,讓其繼承犬科,獲取的犬科的特性,//由于緝毒犬具有緝毒功能,那么它只要實(shí)現(xiàn)緝毒接口即可,這樣即保證緝毒犬具備犬科的特性,也擁有了緝毒的功能class 緝毒犬 extends 犬科 implements 緝毒{public void 緝毒() {}void 吃飯() {}void 吼叫() {}}class 緝毒豬 implements 緝毒{public void 緝毒() {}}* E: 接口和抽象類區(qū)別總結(jié)相同點(diǎn):都位于繼承的頂端,用于被其他類實(shí)現(xiàn)或繼承;都不能直接實(shí)例化對(duì)象;都包含抽象方法,其子類都必須覆寫(xiě)這些抽象方法;區(qū)別:抽象類為部分方法提供實(shí)現(xiàn),避免子類重復(fù)實(shí)現(xiàn)這些方法,提高代碼重用性;接口只能包含抽象方法;一個(gè)類只能繼承一個(gè)直接父類(可能是抽象類),卻可以實(shí)現(xiàn)多個(gè)接口;(接口彌補(bǔ)了Java的單繼承)抽象類是這個(gè)事物中應(yīng)該具備的你內(nèi)容, 繼承體系是一種 is..a關(guān)系接口是這個(gè)事物中的額外內(nèi)容,繼承體系是一種 like..a關(guān)系二者的選用:優(yōu)先選用接口,盡量少用抽象類;需要定義子類的行為,又要為子類提供共性功能時(shí)才選用抽象類;==============================第三節(jié)課開(kāi)始====================================
12多態(tài)概述
* A: 多態(tài)概述多態(tài)是繼封裝、繼承之后,面向?qū)ο蟮牡谌筇匦浴,F(xiàn)實(shí)事物經(jīng)常會(huì)體現(xiàn)出多種形態(tài),如學(xué)生,學(xué)生是人的一種,則一個(gè)具體的同學(xué)張三既是學(xué)生也是人,即出現(xiàn)兩種形態(tài)。 Java作為面向?qū)ο蟮恼Z(yǔ)言,同樣可以描述一個(gè)事物的多種形態(tài)。如Student類繼承了Person類,一個(gè)Student的對(duì)象便既是Student,又是Person。Java中多態(tài)的代碼體現(xiàn)在一個(gè)子類對(duì)象(實(shí)現(xiàn)類對(duì)象)既可以給這個(gè)子類(實(shí)現(xiàn)類對(duì)象)引用變量賦值,又可以給這個(gè)子類(實(shí)現(xiàn)類對(duì)象)的父類(接口)變量賦值。如Student類可以為Person類的子類。那么一個(gè)Student對(duì)象既可以賦值給一個(gè)Student類型的引用,也可以賦值給一個(gè)Person類型的引用。最終多態(tài)體現(xiàn)為父類引用變量可以指向子類對(duì)象。多態(tài)的前提是必須有子父類關(guān)系或者類實(shí)現(xiàn)接口關(guān)系,否則無(wú)法完成多態(tài)。在使用多態(tài)后的父類引用變量調(diào)用方法時(shí),會(huì)調(diào)用子類重寫(xiě)后的方法。13多態(tài)調(diào)用的三種格式
* A:多態(tài)的定義格式:* 就是父類的引用變量指向子類對(duì)象父類類型 變量名 = new 子類類型();變量名.方法名();* B: 普通類多態(tài)定義的格式父類 變量名 = new 子類();舉例: class Fu {}class Zi extends Fu {}//類的多態(tài)使用Fu f = new Zi(); * C: 抽象類多態(tài)定義格式 抽象類 變量名 = new 抽象類子類();舉例: abstract class Fu {public abstract void method();}class Zi extends Fu {public void method(){System.out.println(“重寫(xiě)父類抽象方法”);}}//類的多態(tài)使用Fu fu= new Zi(); * D: 接口多態(tài)定義的格式接口 變量名 = new 接口實(shí)現(xiàn)類();如: interface Fu {public abstract void method();}class Zi implements Fu {public void method(){System.out.println(“重寫(xiě)接口抽象方法”);}}//接口的多態(tài)使用Fu fu = new Zi(); * E: 注意事項(xiàng)同一個(gè)父類的方法會(huì)被不同的子類重寫(xiě)。在調(diào)用方法時(shí),調(diào)用的為各個(gè)子類重寫(xiě)后的方法。如 Person p1 = new Student();Person p2 = new Teacher();p1.work(); //p1會(huì)調(diào)用Student類中重寫(xiě)的work方法p2.work(); //p2會(huì)調(diào)用Teacher類中重寫(xiě)的work方法當(dāng)變量名指向不同的子類對(duì)象時(shí),由于每個(gè)子類重寫(xiě)父類方法的內(nèi)容不同,所以會(huì)調(diào)用不同的方法。14多態(tài)成員方法的特點(diǎn)
* A: 掌握了多態(tài)的基本使用后,那么多態(tài)出現(xiàn)后類的成員有啥變化呢?前面學(xué)習(xí)繼承時(shí),我們知道子父類之間成員變量有了自己的特定變化,* 那么當(dāng)多態(tài)出現(xiàn)后,成員變量在使用上有沒(méi)有變化呢?* 多態(tài)出現(xiàn)后會(huì)導(dǎo)致子父類中的成員變量有微弱的變化 * B: 代碼演示class Fu {int num = 4;}class Zi extends Fu {int num = 5;}class Demo {public static void main(String[] args) {Fu f = new Zi();System.out.println(f.num);Zi z = new Zi();System.out.println(z.num);}}* C: 多態(tài)成員變量當(dāng)子父類中出現(xiàn)同名的成員變量時(shí),多態(tài)調(diào)用該變量時(shí):編譯時(shí)期:參考的是引用型變量所屬的類中是否有被調(diào)用的成員變量。沒(méi)有,編譯失敗。運(yùn)行時(shí)期:也是調(diào)用引用型變量所屬的類中的成員變量。簡(jiǎn)單記:編譯和運(yùn)行都參考等號(hào)的左邊。編譯運(yùn)行看左邊。* D: 多態(tài)出現(xiàn)后會(huì)導(dǎo)致子父類中的成員方法有微弱的變化。看如下代碼class Fu {int num = 4;void show() {System.out.println("Fu show num");}}class Zi extends Fu {int num = 5;void show() {System.out.println("Zi show num");}}class Demo {public static void main(String[] args) {Fu f = new Zi();f.show();}}* E: 多態(tài)成員方法編譯時(shí)期:參考引用變量所屬的類,如果沒(méi)有類中沒(méi)有調(diào)用的方法,編譯失敗。運(yùn)行時(shí)期:參考引用變量所指的對(duì)象所屬的類,并運(yùn)行對(duì)象所屬類中的成員方法。簡(jiǎn)而言之:編譯看左邊,運(yùn)行看右邊。15instanceof關(guān)鍵字
* A: 作用可以通過(guò)instanceof關(guān)鍵字來(lái)判斷某個(gè)對(duì)象是否屬于某種數(shù)據(jù)類型。如學(xué)生的對(duì)象屬于學(xué)生類,學(xué)生的對(duì)象也屬于人類* 格式:boolean b = 對(duì)象 instanceof 數(shù)據(jù)類型;* 舉例:Person p1 = new Student(); // 前提條件,學(xué)生類已經(jīng)繼承了人類boolean flag = p1 instanceof Student; //flag結(jié)果為trueboolean flag2 = p2 instanceof Teacher; //flag結(jié)果為false16多態(tài)-向上轉(zhuǎn)型
* A: 多態(tài)的轉(zhuǎn)型分為向上轉(zhuǎn)型與向下轉(zhuǎn)型兩種:* B: 向上轉(zhuǎn)型:當(dāng)有子類對(duì)象賦值給一個(gè)父類引用時(shí),便是向上轉(zhuǎn)型,多態(tài)本身就是向上轉(zhuǎn)型的過(guò)程。使用格式:父類類型 變量名 = new 子類類型();如:Person p = new Student();==============================第四節(jié)課開(kāi)始====================================
17多態(tài)-向下轉(zhuǎn)型
* A: 向下轉(zhuǎn)型:一個(gè)已經(jīng)向上轉(zhuǎn)型的子類對(duì)象可以使用強(qiáng)制類型轉(zhuǎn)換的格式,將父類引用轉(zhuǎn)為子類引用,這個(gè)過(guò)程是向下轉(zhuǎn)型。如果是直接創(chuàng)建父類對(duì)象,是無(wú)法向下轉(zhuǎn)型的!使用格式:子類類型 變量名 = (子類類型) 父類類型的變量;如:Student stu = (Student) p; //變量p 實(shí)際上指向Student對(duì)象18多態(tài)的好處和弊端
* A: 多態(tài)的好處和弊端* 當(dāng)父類的引用指向子類對(duì)象時(shí),就發(fā)生了向上轉(zhuǎn)型,即把子類類型對(duì)象轉(zhuǎn)成了父類類型。向上轉(zhuǎn)型的好處是隱藏了子類類型,提高了代碼的擴(kuò)展性。* 但向上轉(zhuǎn)型也有弊端,只能使用父類共性的內(nèi)容,而無(wú)法使用子類特有功能,功能有限制。* B: 看如下代碼//描述動(dòng)物類,并抽取共性eat方法abstract class Animal {abstract void eat();}// 描述狗類,繼承動(dòng)物類,重寫(xiě)eat方法,增加lookHome方法class Dog extends Animal {void eat() {System.out.println("啃骨頭");}void lookHome() {System.out.println("看家");}}// 描述貓類,繼承動(dòng)物類,重寫(xiě)eat方法,增加catchMouse方法class Cat extends Animal {void eat() {System.out.println("吃魚(yú)");}void catchMouse() {System.out.println("抓老鼠");}}public class Test {public static void main(String[] args) {Animal a = new Dog(); //多態(tài)形式,創(chuàng)建一個(gè)狗對(duì)象a.eat(); // 調(diào)用對(duì)象中的方法,會(huì)執(zhí)行狗類中的eat方法// a.lookHome();//使用Dog類特有的方法,需要向下轉(zhuǎn)型,不能直接使用// 為了使用狗類的lookHome方法,需要向下轉(zhuǎn)型// 向下轉(zhuǎn)型過(guò)程中,可能會(huì)發(fā)生類型轉(zhuǎn)換的錯(cuò)誤,即ClassCastException異常// 那么,在轉(zhuǎn)之前需要做健壯性判斷 if( !a instanceof Dog){ // 判斷當(dāng)前對(duì)象是否是Dog類型System.out.println("類型不匹配,不能轉(zhuǎn)換"); return; } Dog d = (Dog) a; //向下轉(zhuǎn)型d.lookHome();//調(diào)用狗類的lookHome方法}} * C 多態(tài)總結(jié):什么時(shí)候使用向上轉(zhuǎn)型:當(dāng)不需要面對(duì)子類類型時(shí),通過(guò)提高擴(kuò)展性,或者使用父類的功能就能完成相應(yīng)的操作,這時(shí)就可以使用向上轉(zhuǎn)型。如:Animal a = new Dog();a.eat();什么時(shí)候使用向下轉(zhuǎn)型當(dāng)要使用子類特有功能時(shí),就需要使用向下轉(zhuǎn)型。如:Dog d = (Dog) a; //向下轉(zhuǎn)型d.lookHome();//調(diào)用狗類的lookHome方法向下轉(zhuǎn)型的好處:可以使用子類特有功能。弊端是:需要面對(duì)具體的子類對(duì)象;在向下轉(zhuǎn)型時(shí)容易發(fā)生ClassCastException類型轉(zhuǎn)換異常。在轉(zhuǎn)換之前必須做類型判斷。如:if( !a instanceof Dog){…}19多態(tài)舉例
* A: 畢老師和畢姥爺?shù)墓适? 案例:/*描述畢老師和畢姥爺,畢老師擁有講課和看電影功能畢姥爺擁有講課和釣魚(yú)功能*/class 畢姥爺 {void 講課() {System.out.println("政治");}void 釣魚(yú)() {System.out.println("釣魚(yú)");}}// 畢老師繼承了畢姥爺,就有擁有了畢姥爺?shù)闹v課和釣魚(yú)的功能,// 但畢老師和畢姥爺?shù)闹v課內(nèi)容不一樣,因此畢老師要覆蓋畢姥爺?shù)闹v課功能class 畢老師 extends 畢姥爺 {void 講課() {System.out.println("Java");}void 看電影() {System.out.println("看電影");}}public class Test {public static void main(String[] args) {// 多態(tài)形式畢姥爺 a = new 畢老師(); // 向上轉(zhuǎn)型a.講課(); // 這里表象是畢姥爺,其實(shí)真正講課的仍然是畢老師,因此調(diào)用的也是畢老師的講課功能a.釣魚(yú)(); // 這里表象是畢姥爺,但對(duì)象其實(shí)是畢老師,而畢老師繼承了畢姥爺,即畢老師也具有釣魚(yú)功能// 當(dāng)要調(diào)用畢老師特有的看電影功能時(shí),就必須進(jìn)行類型轉(zhuǎn)換畢老師 b = (畢老師) a; // 向下轉(zhuǎn)型b.看電影();}20筆記本電腦案例
* A:案例介紹* 定義USB接口(具備開(kāi)啟功能、關(guān)閉功能),筆記本要使用USB設(shè)備,即筆記本在生產(chǎn)時(shí)需要預(yù)留可以插入U(xiǎn)SB設(shè)備的USB接口,即就是筆記本具備使用USB設(shè)備的功能,* 但具體是什么USB設(shè)備,筆記本并不關(guān)心,只要符合USB規(guī)格的設(shè)備都可以。鼠標(biāo)和鍵盤(pán)要想能在電腦上使用,那么鼠標(biāo)和鍵盤(pán)也必須遵守USB規(guī)范,不然鼠標(biāo)和鍵盤(pán)的生產(chǎn)出來(lái)無(wú)法使用* 進(jìn)行描述筆記本類,實(shí)現(xiàn)筆記本使用USB鼠標(biāo)、USB鍵盤(pán)USB接口,包含開(kāi)啟功能、關(guān)閉功能筆記本類,包含運(yùn)行功能、關(guān)機(jī)功能、使用USB設(shè)備功能鼠標(biāo)類,要符合USB接口鍵盤(pán)類,要符合USB接口* B: 案例分析* 階段一:使用筆記本,筆記本有運(yùn)行功能,需要筆記本對(duì)象來(lái)運(yùn)行這個(gè)功能* 階段二:想使用一個(gè)鼠標(biāo),又有一個(gè)功能使用鼠標(biāo),并多了一個(gè)鼠標(biāo)對(duì)象。* 階段三:還想使用一個(gè)鍵盤(pán) ,又要多一個(gè)功能和一個(gè)對(duì)象* 問(wèn)題:每多一個(gè)功能就需要在筆記本對(duì)象中定義一個(gè)方法,不爽,程序擴(kuò)展性極差。降低鼠標(biāo)、鍵盤(pán)等外圍設(shè)備和筆記本電腦的耦合性。21筆記本電腦案例代碼實(shí)現(xiàn)
* A: 代碼實(shí)現(xiàn)定義鼠標(biāo)、鍵盤(pán),筆記本三者之間應(yīng)該遵守的規(guī)則interface USB {void open();// 開(kāi)啟功能void close();// 關(guān)閉功能}鼠標(biāo)實(shí)現(xiàn)USB規(guī)則class Mouse implements USB {public void open() {System.out.println("鼠標(biāo)開(kāi)啟");}public void close() {System.out.println("鼠標(biāo)關(guān)閉");}}鍵盤(pán)實(shí)現(xiàn)USB規(guī)則class KeyBoard implements USB {public void open() {System.out.println("鍵盤(pán)開(kāi)啟");}public void close() {System.out.println("鍵盤(pán)關(guān)閉");}}定義筆記本class NoteBook {// 筆記本開(kāi)啟運(yùn)行功能public void run() {System.out.println("筆記本運(yùn)行");}// 筆記本使用usb設(shè)備,這時(shí)當(dāng)筆記本對(duì)象調(diào)用這個(gè)功能時(shí),必須給其傳遞一個(gè)符合USB規(guī)則的USB設(shè)備public void useUSB(USB usb) {// 判斷是否有USB設(shè)備if (usb != null) {usb.open();usb.close();}}public void shutDown() {System.out.println("筆記本關(guān)閉");}}public class Test {public static void main(String[] args) {// 創(chuàng)建筆記本實(shí)體對(duì)象NoteBook nb = new NoteBook();// 筆記本開(kāi)啟nb.run();// 創(chuàng)建鼠標(biāo)實(shí)體對(duì)象Mouse m = new Mouse();// 筆記本使用鼠標(biāo)nb.useUSB(m);// 創(chuàng)建鍵盤(pán)實(shí)體對(duì)象KeyBoard kb = new KeyBoard();// 筆記本使用鍵盤(pán)nb.useUSB(kb);// 筆記本關(guān)閉nb.shutDown();}}22總結(jié)
* 把今天的知識(shí)點(diǎn)總結(jié)一遍。 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: lamp wordpress
- 下一篇: jmeter时间格式化