Java基礎(chǔ)進階 第四天 抽象接口多態(tài)

今日任務(wù)

1,能夠獨立使用抽象類

2,能夠獨立使用多態(tài)

3,能夠獨立使用接口

4,能夠理解適配器設(shè)計模式

1. 抽象類

1.1. 抽象類的產(chǎn)生

需求:創(chuàng)建類描述貓和狗的行為;

貓的行為:抓老鼠;吃魚;

狗的行為:看家;吃骨頭;

分析:這個需求有兩類事物,需要創(chuàng)建兩個類來分別描述它們;

1、創(chuàng)建描述貓的類:


1.png

2、創(chuàng)建描述狗的類:


2.png

3、問題:上面兩個類中有相同的方法:


3.png

4、為了提高代碼的復(fù)用性,需要將其抽取到共同的父類中;貓和狗都是動物,所以可以創(chuàng)建一個動物類,讓貓和狗都繼承它:


4.png

問題:在抽取共同方法到父類中的過程中發(fā)現(xiàn),不同子類雖然具有相同的方法,但是不同子類的實現(xiàn)不同,在父類中無法準(zhǔn)確描述;

5.png

像這種在父類中不能準(zhǔn)確描述、需要子類去實現(xiàn)的方法,就應(yīng)該定義為抽象方法;

抽象方法的書寫格式:

A、抽象函數(shù)沒有方法體,連大括號都沒有;

B、抽象函數(shù)使用關(guān)鍵字abstract修飾,關(guān)鍵字寫在函數(shù)的返回值類型前面;

抽象函數(shù)表示的是描述不清的功能;如果一個類中有了抽象函數(shù),說明這個類表示的事物也是描述不清的,需要定義為抽象的類;

抽象類的書寫格式:

直接將abstract關(guān)鍵字寫在class關(guān)鍵字前面;


6.png

1.2. 抽象類的特點

1.2.1. 抽象類不能實例化

因為抽象類表示的是一個描述不清楚的事物,就像一張數(shù)據(jù)不清的圖紙,無法創(chuàng)建對象;


7.png

1.2.2. 子類繼承抽象類,必須實現(xiàn)父類的所有抽象函數(shù),否則子類也是抽象的

8.png

9.png

結(jié)論:抽象類不能直接使用,必須通過子類繼承它,然后重寫抽象類中的所有抽象函數(shù),最后通過子類對象使用這些函數(shù);

如果希望一些類都必須具有某個功能,就可以將這個功能放到他們共同的父類中,如果不同的子類的實現(xiàn)不同,就需要將這個功能定義為抽象函數(shù)

1.3. 抽象類的細節(jié)問題

1, 抽象類一定是父類嗎?
是;

首先抽象類就是通過多個不同的子類不斷向上抽象共同的信息,發(fā)現(xiàn)有相同但實現(xiàn)不同的功能,所以才定義為抽象類的;
而且抽象類不能實例化,只能通過子類繼承它,然后在子類中重寫父類所有抽象函數(shù),通過子類對象去使用;
所以抽象類一定是父類;

2, 抽象類中可以書寫哪些成員?

抽象類也是一個類,可以書寫類中的所有成員;

10.png

3, 抽象類中可以不書寫抽象方法嗎?
可以;

11.png

如果一個類雖然沒有抽象函數(shù),但是不想被實例化,又可以被繼承,就可以將其定義為抽象類,沒有抽象方法的抽象類;
這種類的典型應(yīng)用之一就是適配器模式;

4,抽象關(guān)鍵字abstract不能和哪些關(guān)鍵字共存?
因為抽象函數(shù)必須被繼承的子類重寫,所以和不能被繼承和重寫的關(guān)鍵字都不能共存:private;final;

12.png

13.png

因為被static修飾的函數(shù)是靜態(tài)函數(shù),可以直接類名訪問,和類的對象無關(guān);如果抽象函數(shù)可以靜態(tài)化,也可以直接通過類名訪問,但是調(diào)用一個抽象函數(shù)沒有意義,所以抽象函數(shù)也不能和static關(guān)鍵字共存;


14.png

5、一個類什么時候需要定義為抽象類?
1、如果一個類中有抽象函數(shù),這個類就要被定義為抽象類;
2、如果一個類中沒有抽象函數(shù),但是這個類不希望被實例化,同時希望它可以被繼承,就需要聲明為抽象類;

1.5. 抽象類總結(jié)

抽象類的概念:是使用關(guān)鍵字abstract修飾的類就是抽象類;
抽象類的產(chǎn)生:當(dāng)多個不能相互繼承的類具有相同的功能時,就需要將共同的信息向上抽取,放到公共的父類中;如果公共的父類只能描述所有子類都具有的功能,但描述不清功能的具體實現(xiàn),就需要將該函數(shù)定義為抽象的,使用關(guān)鍵字abstract修飾;如果一個類中出現(xiàn)了抽象的函數(shù),說明這個類也是不具體的,應(yīng)該定義為抽象類,使用abstract修飾;
抽象類的特點
抽象類不能實例化;
抽象類中的抽象函數(shù)必須由子類去實現(xiàn),否則子類也是抽象類;
抽象類也是一個類,類中可以書寫所有成員,也可以沒有抽象函數(shù);

因為抽象函數(shù)必須由子類實現(xiàn),所以不參與繼承的(private)和不能被子類重寫的(final)關(guān)鍵字不能和abstract共存;
因為靜態(tài)函數(shù)不需要類的對象就可以直接使用,所以static關(guān)鍵字也不能和abstract共存;
如果一個類不希望被實例化,但又希望被子類繼承,就可以定義為抽象的,即使類中沒有抽象函數(shù);

2. 多態(tài)

2.1. 多態(tài)的引入

在生活中,我們經(jīng)常對同一類事物有不同的稱呼。例如:
蘋果,又叫水果;褲子,又叫衣服;

而且一般習(xí)慣使用更抽象的概念描述具體的事物;如:
買蘋果,一般說買水果;買褲子,一般說買衣服;
像這樣同一個事物可以用不同的方式表示,就叫做多態(tài);

2.2. java中的多態(tài)

2.2.1. 多態(tài)的體現(xiàn)

在Java中,使用類描述一類事物;
要模擬生活中的多態(tài),就需要使用兩個類;而且兩個類都能指代同一個具體對象;


15.png

java中多態(tài)的體現(xiàn):
使用父類型引用指向子類對象;
(使用接口類型引用指向?qū)崿F(xiàn)類對象)

2.2.2. 多態(tài)的使用前提

之所以可以使用父類型引用指向子類對象,因為子類和父類之間有 “是”的關(guān)系,子類描述的事物實際上是父類的一個特例,所以可以使用父類型引用指向子類對象;
而沒有繼承關(guān)系的兩個類就不能這樣做:


16.png

所以java中使用多態(tài)的前提:
多態(tài)中的兩個類之間有繼承關(guān)系;

2.2.3. 多態(tài)的好處

在生活中,一般都會使用多態(tài)的形式描述一個事物,如喝啤酒,不說啤酒,而是說喝酒,買褲子不說買褲子,而是說買衣服,是因為這樣指代的范圍更廣,方便描述;
用軟件的術(shù)語來說,就是提高擴展性,降低耦合性;
例如:模擬動物醫(yī)院中,動物醫(yī)生檢查動物(貓、狗);


17.png
18.png
19.png
20.png

問題:1、每添加一個測試的動物,都要添加一個測試的功能,使用麻煩(也就是擴展性差);而且每個功能中的代碼都基本一樣,造成代碼復(fù)用差;

2、貓和狗中也有重復(fù)的代碼,代碼復(fù)用性差;
使用多態(tài)解決問題:

//模擬動物醫(yī)院中,動物醫(yī)生檢查動物(貓、狗);
//動物
abstract class Animal
{
    String name;//名字
    int age;//年齡

    public abstract void eat();
    public abstract void say();
    public abstract void sleep();
}
//貓
class Cat extends Animal
{
    //吃
    public void eat(){
        System.out.println("吃魚");
    }
    //叫
    public void say(){
        System.out.println("喵喵");
    }
    //睡覺
    public void sleep(){
        System.out.println("zzZZZ");
    }
}
//狗
class Dog extends Animal
{
    //吃
    public void eat(){
        System.out.println("吃骨頭");
    }
    //叫
    public void say(){
        System.out.println("汪汪");
    }
    //睡覺
    public void sleep(){
        System.out.println("zzZZZ");
    }
}
//動物醫(yī)生
class AnimalDoctor
{
    //檢查動物
    public void check(Animal a){
        //顯示動物的屬性
        System.out.println(a.name + "|" + a.age);
        //測試動物的行為
        a.eat();//測試吃
        a.say();//測試叫
        a.sleep();//測試睡
    }
}
class Test
{
    public static void main(String[] args) 
    {
        //創(chuàng)建一個動物醫(yī)生的對象
        AnimalDoctor ad = new AnimalDoctor();
        //父類引用指向子類對象,使用了多態(tài)
        Animal c = new Cat();
        c.name = "小咪";
        c.age = 3;
        //調(diào)用動物醫(yī)生對象的檢查功能,檢查貓的對象
        ad.check(c);
        System.out.println("--------------------");
        //創(chuàng)建一個狗的對象
        Dog d = new Dog();
        d.name = "阿黃";
        d.age = 4;
        //調(diào)用動物醫(yī)生對象的檢查功能,檢查狗的對象
        /*
            check函數(shù)接收參數(shù)的變量是Animal類型的變量;
            Animal是Dog類的父類,在給函數(shù)傳參時,將Dog類型的對象d賦值給Animal 類型的變量,
            是將子類對象賦值給父類引用變量,使用了多態(tài)
        */
        ad.check(d);

    }
}
21.png

結(jié)論:
1、使用多態(tài)可以提高程序的擴展性;
2、提高代碼的復(fù)用性,降低程序的冗余性;

2.2.4. 多態(tài)的弊端

多態(tài)有好處,也會有弊端;


22.png
23.png

報錯原因:編譯期只進行語法檢查,不會執(zhí)行代碼;
在編譯期檢查到30行代碼時發(fā)現(xiàn),要通過Fu類型的變量f調(diào)用一個函數(shù)func,就會去Fu類中找有沒有這個方法,因為沒有,所以會報錯;

使用多態(tài)的弊端:
只能使用父類中已經(jīng)定義的成員變量和函數(shù),不能使用子類中獨有的變量或函數(shù);

2.3. 多態(tài)的類型轉(zhuǎn)換

要解決多態(tài)的弊端,必須學(xué)習(xí)使用多態(tài)的類型轉(zhuǎn)換:

2.3.1. 多態(tài)的類型轉(zhuǎn)換

自動向上轉(zhuǎn)型:
在使用多態(tài)時,將子類型對象賦值給父類型引用,相當(dāng)于將對象的類型提升為父類型,叫做向上轉(zhuǎn)型;因為這個過程可以自動進行,所以叫做自動向上轉(zhuǎn)型;
如:

class  Fu{}
class  Zi  extends Fu{}
Fu  f =  new  Zi();//就是發(fā)生了自動向上轉(zhuǎn)型 

強制向下轉(zhuǎn)型:
將父類型引用(對象)賦值給子類型引用,相當(dāng)于將父類型向下轉(zhuǎn)換成子類型,叫做向下轉(zhuǎn)型;這個過程不能自動進行,需要強制進行,所以叫做強制向下轉(zhuǎn)型;
如:

class  Fu{}
class  Zi  extends Fu{}
Fu   f    =  new  Fu();
Zi   z  = (Zi)f;//這里將父類型引用轉(zhuǎn)換為子類引用,發(fā)生了強制向下轉(zhuǎn)型;
24.png

結(jié)論:使用強制向下轉(zhuǎn)型,可以解決多態(tài)使用中的弊端;

2.3.2. 強制向下轉(zhuǎn)型的問題

25.png

2.3.3. instanceof關(guān)鍵字

要避免強制向下轉(zhuǎn)型中出現(xiàn)的問題,就應(yīng)該在轉(zhuǎn)型前先對要轉(zhuǎn)型的引用進行檢查,判斷類型是否正確;
要判斷一個引用指向的對象是否是某種類型,就要使用instanceof關(guān)鍵字:

用法:
引用名 instanceof 類名
作用: 判斷符號左邊的引用指向的對象是否是右邊這個類的對象;
根據(jù)這個關(guān)鍵字的用法,我們可以在對一個引用進行強制向下轉(zhuǎn)型前進行判斷,如果是某個類的對象,再強制轉(zhuǎn)換,否則就不轉(zhuǎn)換,就可以避免上面的問題了;

26.png

結(jié)論:在強制向下轉(zhuǎn)型前先使用instanceof關(guān)鍵字進行判斷,可以避免出現(xiàn)類型轉(zhuǎn)換異常;

2.4. 多態(tài)中成員使用的特點

在使用多態(tài)時,是通過父類型引用操作子類對象的,這就會造成實際使用的成員和使用對象本身所屬類型的引用操作對象有所不同,在實際開發(fā)中就要注意它們的不同;


27.png

編譯時:使用的所有成員(靜態(tài)和非靜態(tài)的)都要檢查父類中有沒有;

28.png

29.png

運行時:只有非靜態(tài)函數(shù)使用的是子類中的,其他成員全部都是父類的;
為方便大家記憶,將上面得到的結(jié)果總結(jié)成一句話就是:
多態(tài)中的成員,在編譯期全部看父類,運行期只有非靜態(tài)函數(shù)看子類;

2.5. 多態(tài)總結(jié)

多態(tài)的概念:同一個事物可以有多種不同的表示形態(tài);
多態(tài)在Java中的體現(xiàn):父類型引用指向子類實例對象;(接口類型引用指向?qū)崿F(xiàn)類對象);
多態(tài)的前提:多態(tài)中的兩個類型,必須有繼承關(guān)系(或者接口實現(xiàn)關(guān)系);
多態(tài)的好處:使用多態(tài)可以提高代碼復(fù)用性,降低維護成本;提高程序擴展性,降低程序的耦合性;
多態(tài)的弊端:父類型引用不能使用子類獨有屬性和功能;
多態(tài)弊端的解決:使用強制向下轉(zhuǎn)型,將父類型引用轉(zhuǎn)換為子類型引用;
多態(tài)的類型轉(zhuǎn)換:將子類型引用賦值給父類型引用,是向上轉(zhuǎn)型,因為父類型中的成員子類中都有,所以可以自動轉(zhuǎn)換,叫做自動向上轉(zhuǎn)型;
將父類型引用賦值給子類型引用,是向下轉(zhuǎn)型,因為父類型中不一定具有子類型中的成員,所以需要強制轉(zhuǎn)換,叫做強制向下轉(zhuǎn)型;
強制向下轉(zhuǎn)型容易遇到的問題:如果將不是該類的對象強制轉(zhuǎn)換為該類型,就會出現(xiàn)一個運行時異常:類型轉(zhuǎn)換異常;
避免類型轉(zhuǎn)換異常的解決辦法:在強制向下轉(zhuǎn)型之前先使用關(guān)鍵字:instanceof 進行判斷;
多態(tài)中成員的特點:多態(tài)發(fā)生在父類型引用和子類對象之間,所以靜態(tài)成員不參與多態(tài),編譯和運行都看父類;
非靜態(tài)成員,編譯期都看父類,運行期,函數(shù)看子類;

3. 接口

3.1. 接口的引入

需求:分別描述以下三種動物的行為:
狗:吃;叫;
貓:吃;叫;
豬:吃;叫;

類的關(guān)系圖解:


30.png

需求升級:
貓和狗,經(jīng)過訓(xùn)練,學(xué)會的新的功能:表演;


31.png

3.2. 接口的代碼體現(xiàn):

3.2.1. 接口的聲明格式

接口不是一個類,所以聲明接口不能使用class關(guān)鍵字,而是使用interface關(guān)鍵字;

32.png

接口編譯后也會生成一個class文件:

Inter.class

3.2.2. 接口中能書寫的成員

接口中可以書寫的成員和類不同,只能書寫成員變量和函數(shù);
而且成員變量和函數(shù)都有固定的修飾符修飾:
成員變量的修飾符是: public static final
函數(shù)的修飾符是: public abstract
在實際使用中,修飾符可以省略不寫,但是編譯器會添加;
但是不能寫錯了;


33.png

為了簡單,一般函數(shù)和變量前面的修飾符都可以省略不寫,但是關(guān)鍵字public不要省略;
(從JDK8開始,為了能對原來的接口擴展新的方法,允許接口中可以有默認實現(xiàn)的方法,使用default修飾;)

3.2.3. 接口的實現(xiàn):

34.png

類和抽象類的關(guān)系是繼承,而類和接口的關(guān)系是實現(xiàn);
一個類實現(xiàn)一個接口,使用的是關(guān)鍵字:implements;


35.png

一個類繼承一個類同時實現(xiàn)一個接口的寫法:
先寫繼承,然后再跟接口的實現(xiàn):


36.png

3.2.4. 多態(tài)使用接口:

一般開發(fā)中,使用接口,通過多態(tài)的形式使用接口;
接口的多態(tài)的體現(xiàn):
接口類型引用指向?qū)崿F(xiàn)類對象;


37.png

3.3. 接口的多實現(xiàn)&多繼承

java中的類只能支持單一繼承和多重繼承,但是不等于java不支持多繼承;java通過接口實現(xiàn)多繼承;

3.3.1. 接口的多實現(xiàn)

一個類可以同時實現(xiàn)多個接口;


38.png

3.3.2. 接口的多繼承

接口與接口之間是繼承關(guān)系,一個接口可以繼承多個接口


39.png
40.png

3、接口的使用思想

3.3.3. 接口的作用總結(jié)

1、接口用來描述不屬于一個繼承體系的額外的公共的功能;
2、通過多態(tài)使用接口,可以提高程序的擴展性;
3、接口實現(xiàn)的java的多繼承;

4、接口可以定義規(guī)則;

3.3.4. 使用接口定義規(guī)則

需求:模擬電腦使用鍵盤和鼠標(biāo)

3.4. 接口總結(jié)

接口的聲明格式

  interfaceInter{}

接口中能書寫的成員
成員變量:全部都使用public static final 修飾;所以接口中的成員變量都是常量;
成員函數(shù):全部都使用 public abstract 修飾;
接口中沒有構(gòu)造函數(shù);

接口的細節(jié)
接口不能實例化,只能被類實現(xiàn);
實現(xiàn)接口的類必須實現(xiàn)接口的所有方法,否則實現(xiàn)類必須是抽象的;
接口與接口是繼承的關(guān)系,一個接口可以繼承多個接口;類和接口是實現(xiàn)的關(guān)系,一個類可以實現(xiàn)多個接口;
通常開發(fā)中使用接口類型的引用指向?qū)崿F(xiàn)類的對象,這是多態(tài)的體現(xiàn);

接口的作用
描述非繼承體系中的共性內(nèi)容;
通過多態(tài)使用接口,可以提高程序的擴展性;
實現(xiàn)的java的多繼承;
接口可以定義規(guī)則;

4. 接口和抽象類的區(qū)別

接口和抽象類的共同點:都可以有抽象函數(shù),都不能實例化;

4.1. 接口和抽象類的區(qū)別

1、從聲明上
i. 抽象類是一個類,需要使用關(guān)鍵字:class聲明
ii. 接口不是一個類,使用關(guān)鍵字:interface聲明

2、從能夠書寫的成員上看:
i. 抽象類可以書寫類中的所有成員
ii. 接口中只能書寫常量和抽象函數(shù);
(從JDK8開始,接口中可以有實現(xiàn)的函數(shù))

3、從有無構(gòu)造函數(shù)上看:
i. 抽象類有構(gòu)造函數(shù),是給子類實例化對象使用的
ii. 接口沒有構(gòu)造函數(shù)

4、從作用上看:
i. 抽象類是描述的繼承體系中的共同的特征和行為,如果行為不確定,就定義為抽象函數(shù);
ii. 接口描述的是不屬于繼承體系的共同的功能;接口可以用來定義規(guī)則;

5、繼承關(guān)系上:
i. 抽象類是一個類,只支持單一繼承和多重繼承;
ii. 接口和接口可以多繼承和多重繼承;接口和實現(xiàn)類可以多實現(xiàn);

4.2. 接口和抽象類的使用練習(xí)

需求:描述手機和電腦,都有開機、關(guān)機和可以玩游戲的功能;


41.png

5. 適配器(Adaptor)設(shè)計模式

5.1. 什么是適配器

生活中的適配器
電源適配器:變壓;把原來不符合使用的220伏的交流電轉(zhuǎn)換成適合電腦使用的電壓和直流電;
變壓器:將不符合使用要求的電壓轉(zhuǎn)換成符合使用要求的電壓;
調(diào)制解調(diào)器(貓):將電信號和數(shù)字信號進行相互轉(zhuǎn)換;
網(wǎng)線轉(zhuǎn)接器:將電腦上沒有空間不能直接使用的水晶頭轉(zhuǎn)換為電腦上有空間使用的USB接口;
適配器,可以將原本不符合使用的轉(zhuǎn)換成符合使用要求的東西;

適配器模式:
一種設(shè)計模式,解決的問題就是:
將原來不符合使用要求轉(zhuǎn)換成符合使用要求的;

5.2. Java中的適配器

根據(jù)適配的內(nèi)容不同,可以將適配器分為三類:
類的適配;對象的適配;接口的適配;
需求:看下列程序,分別書寫實現(xiàn)類滿足User類的需求;

interface Inter//接口
{
    public void method1();
    public void method2();
    public void method3();
    public void method4();
    public void method5();
}
class User//用戶類
{
    public static void test1(Inter i){
        i.method1();
        i.method2();
    }
    public static void test2(Inter i){
        i.method2();
    }
    public static void test3(Inter i){
        i.method4();
    }
}

原來的實現(xiàn):
//需求:看下列程序,分別書寫實現(xiàn)類滿足User類的需求;

//需求:看下列程序,分別書寫實現(xiàn)類滿足User類的需求;
interface Inter//接口
{
    public void method1();
    public void method2();
    public void method3();
    public void method4();
    public void method5();
}
class User//用戶類
{
    public static void test1(Inter i){
        i.method1();
        i.method2();
    }
    //要求:本方法中調(diào)用的method2方法和test1方法中調(diào)用的method2方法實現(xiàn)不同;
    public static void test2(Inter i){
        i.method2();
    }
    public static void test3(Inter i){
        i.method4();
    }
}
/*
    因為要求再test2方法和test1方法接收的參數(shù)是不同類的對象,里面的method2方法的實現(xiàn)不同;
    所以要重新定義一個類實現(xiàn)Inter接口,實現(xiàn)里面的method2方法;
*/
class InterImpl2 implements Inter
{
    
    public void method2(){
        System.out.println("2222222222222222222222222");
    }
    //其他方法再test1中沒有使用到,不需要實現(xiàn);但是因為是接口的實現(xiàn)類,所以還必須重寫這些函數(shù)
    //所以都使用空實現(xiàn)
    public void method1(){}
    public void method3(){}
    public void method4(){}
    public void method5(){}
}
class InterImpl1  implements Inter
{
    public void method1(){
        System.out.println("test1----method1");
    }
    public void method2(){
        System.out.println("test2----method2");
    }
    //其他方法再test1中沒有使用到,不需要實現(xiàn);但是因為是接口的實現(xiàn)類,所以還必須重寫這些函數(shù)
    //所以都使用空實現(xiàn)
    public void method3(){}
    public void method4(){}
    public void method5(){}
}
class Test
{
    public static void main(String[] args) 
    {
        //測試User類的test1方法,因為時靜態(tài)函數(shù),所以可以直接通過類名調(diào)用;
        User.test1(new InterImpl1());//使用匿名對象的方式傳參

        //測試User類的test2方法
        User.test2(new InterImpl2());
    }
}

程序中的問題:


42.png

直接使用接口,會有麻煩,不方便使用,所以可以考慮使用適配器設(shè)計模式;

首先應(yīng)該定義一個適配器類,然后具體的實現(xiàn)類不直接實現(xiàn)接口,而是和適配器類打交道;


43.png

接口的適配器,就是一個使用空實現(xiàn)實現(xiàn)了接口中所有抽象函數(shù)的抽象類;

44.png

通過適配器類,具體的業(yè)務(wù)邏輯類就可以只關(guān)心需要關(guān)心的功能,不需要實現(xiàn)的功能,就可以忽略;

5.3. 適配器小結(jié)

適配器的作用,就是適配、轉(zhuǎn)換,將不符合使用要求的東西轉(zhuǎn)換為符合使用要求的;
適配器設(shè)計模式,解決的是怎么將不符合使用要求的類、對象或接口轉(zhuǎn)換為符合使用要求的;
根據(jù)適配的對象不同,可以將適配器分為類的適配、對象的適配和接口的適配;

接口的適配的步驟:
1、創(chuàng)建一個適配器類實現(xiàn)接口,在這個類中使用空實現(xiàn)實現(xiàn)接口中的所有抽象函數(shù);
2、因為適配器類中的函數(shù)都是空實現(xiàn)的,創(chuàng)建該類的對象沒有意義,所以要將適配器類定義為抽象類;
3、要使用適配器類,只需書寫類繼承適配器類即可;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 1,272評論 0 5
  • 一:java概述: 1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)...
    慕容小偉閱讀 1,942評論 0 10
  • 整理來自互聯(lián)網(wǎng) 1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工具...
    Ncompass閱讀 1,617評論 0 6
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,812評論 0 11
  • 昨天因為月華打車送會計回家以及她送禮給退休園長的事,和她大吵了一通,主要是我在罵她數(shù)落她。 半夜給我發(fā)信息,要分手...
    月華天使閱讀 136評論 0 0

友情鏈接更多精彩內(nèi)容