Java基礎(chǔ)6-多態(tài);匿名內(nèi)部類;適配器模式

昨日內(nèi)容回顧

  1. 類成員

    • 構(gòu)造函數(shù):和類同名,沒有返回值,可以重載
      this(),super()
    • 成員變量:
    • 成員函數(shù):
    • 靜態(tài)代碼塊:類加載執(zhí)行
    • {}:構(gòu)造代碼塊
  2. interface

    • 所有方法都是抽象的

    • 屬性有固定的修飾符.

    • 接口之間是繼承關(guān)系,可以多重繼承

    • 類和接口之間是實(shí)現(xiàn)關(guān)系,類可以實(shí)現(xiàn)多個接口

        class A implements B,C,D
      
    • 面向接口編程降低耦合度.

  1. 抽象類

    • abstract class
    • 抽象方法沒有方法體,所在的類必須抽象類。
    • 抽象類可以沒有抽象方法。
    • 不能實(shí)例化,有構(gòu)造函數(shù)
  2. final

    • 修飾類,類不能被繼承

    • 修飾方法,方法不能被重寫

    • 修飾變量,不能被修改,常量

  3. 內(nèi)部類

    • 成員位置:Benz$Engine

    • 方法內(nèi)部:Benz$nEngine

  4. 繼承
    extends: 單重繼承,多層繼承

作業(yè)解析

  1. 文字闡述靜態(tài)代碼塊的作用。
    答:靜態(tài)代碼塊在類加載時執(zhí)行,且只執(zhí)行一次,靜態(tài)代碼塊用于初始化類。

  2. 構(gòu)造代碼塊與構(gòu)造函數(shù)的調(diào)用順序如何?和方法的聲明位置是否有關(guān)?為什么?構(gòu)造代碼塊的作用是什么?
    答:構(gòu)造代碼塊與構(gòu)造函數(shù)是同一級別的,不管聲明順序如何,構(gòu)造對象時先按序調(diào)用構(gòu)造代碼塊,然后才調(diào)用構(gòu)造函數(shù)。構(gòu)造代碼塊的作用是給對象統(tǒng)一初始化數(shù)據(jù)

  3. 類加載時,是否一定會執(zhí)行靜態(tài)代碼塊?如何手動控制類加載?
    答:不一定,可以通過Class.forName(String,boolean initialize, ClassLoder)方法手動控制

  4. 定義類Person,Man,Woman形成繼承關(guān)系。

     class Person{
         String name;
         int age;
     }
     
     class Man extends Person{
     }
     
     class Woman extends Person{
     }
    
  5. 什么是抽象方法?什么是抽象類?抽象類是否有構(gòu)造函數(shù),是否可以重載?
    答:沒有方法體的方法就是抽象方法,用abstract修飾, 抽象類是不能夠?qū)嵗念?,用abstract修飾,有構(gòu)造函數(shù),可以重載

  6. 抽象修飾符有哪些非法組合?并給出合理的解釋?
    答:

    • private abstract: abstract修飾的方法需要子類去實(shí)現(xiàn),若定義為private,則無法被子類繼承,更別說實(shí)現(xiàn)了
    • final abstract: final修飾的方法不能被重寫,也就無法實(shí)現(xiàn)
    • static abtract: 用abtract修飾的目的就是不想讓方法被實(shí)例化對象調(diào)用,static則不需要實(shí)例化就可以調(diào)用類的方法,與abstract設(shè)計(jì)的初衷不符
  7. super和this作用以及用法以及注意事項(xiàng)?
    答:

    • super是指向父類的引用。訪問父類構(gòu)造用super(xxx),必須在構(gòu)造函數(shù)第一行,訪問父類屬性和方法使用super.
    • this是指向?qū)ο笞陨淼囊?。訪問自身屬性和方法使用this.,訪問自身構(gòu)造使用this(xxx),且必須放置在構(gòu)造函數(shù)的首行。
  8. 定義接口

    • IWhite

        interface IWhite{
            public void iWhite();
        }
      
    • IRich

        interface IRich{
            public void iRich();
        }
      
    • IBeanti

        interface IBeanti{
            public void iBeanti();
        }
      
    • 定義類,實(shí)現(xiàn)以上三個接口.(WomenStar)

        interface IWRB extends IWhite,IRich,IBeanti{
        }
        
        class WomenStar implements IWRB{
            public void iWhite(){
                System.out.println("white");
            }
            public void iRich(){
                System.out.println("rich");
            }
            public void iBeanti(){
                System.out.println("beanti");
            }
        }
* 定義土豪類(EarchRicher.marring(...))

        class EarchRicher{
            public void marring(IWRB i){
                i.iWhite();
                i.iRich();
                i.iBeanti();
            }
        }

多態(tài)

  1. 多態(tài)就是多種狀態(tài)(形態(tài))
    對繼承的類來講,使用父類類型引用子類的對象;
    對于接口來說,可以使用接口引用實(shí)現(xiàn)了該接口的類所創(chuàng)建的對象;

  2. 好丈夫 + 好父親 + 好兒子
    ClassCastException:類轉(zhuǎn)換異常

  3. 繼承和實(shí)現(xiàn)是多態(tài)的前提條件

  4. 類中方法可以覆蓋,成員變量(資產(chǎn))不能覆蓋

     class Person{
         public int prop ;   //財產(chǎn)
     }
    
     class Man extends Person{
         public int prop ;   //
     }
    
     public static void main(String[] args){
         Man man = new Man();
         Person p = man ;
    
         Object obj = new Man();
         Person pp = (Man)obj ;
     }
    

匿名內(nèi)部類對象

將類的定義,方法的實(shí)現(xiàn),對象的創(chuàng)建一氣呵成

適配器模式

  1. 如果接口中的方法較多,而使用接口的時候卻只關(guān)心其中的一個或者幾個方法(關(guān)心的方法較少);

  2. 如果采用常規(guī)手段,就需要對每個方法都加以實(shí)現(xiàn)??梢詣?chuàng)建一個類來實(shí)現(xiàn)接口,對不關(guān)心的方法進(jìn)行空實(shí)現(xiàn),對關(guān)心的方法保持不變。定義的新類繼承抽象類后,將所關(guān)心的方法加以實(shí)現(xiàn)即可。

此種模式就稱為適配器模式。常用于UI設(shè)計(jì)中的按鈕點(diǎn)擊事件的處理

練習(xí)

  1. 定義Father類,聲明asset int私有屬性,同時生成get/set方法。
  2. 定義Son類繼承Father,聲明asset int私有屬性,同時生成get/set方法。
  3. 創(chuàng)建Son對象,分別使用Father和Son類型的變量進(jìn)行引用,依次調(diào)用

他們的setAsset()方法,然后再依次調(diào)用getAsset()方法,觀察打印數(shù)據(jù)是否相同?

class Father{
    //私有財產(chǎn)
    private int asset = 10000;

    //getter
    public int getAsset(){
        return asset ;
    }

    //setter
    public void setAsset(int asset) {
        this.asset = asset ;
    }
}


class Son extends Father{
    public int asset = 100;

    public void setAsset(int asset){
        this.asset = asset ;
    }

    public int getAsset(){
        return asset ;
    }

    public int getFatherAsset(){
        return super.getAsset();
    }
}

class MultiDemo3{
    public static void main(String[] args){
        Son s = new Son();
        s.setAsset(500);            //若setAsset()沒有被重寫,則 father.asset = 500;若setAsset()被重寫,則self.asset = 500
        System.out.println(s.getAsset());   //若getAsset()沒有重寫,則==10000;若getAsset()被重寫,則==500
        System.out.println(s.asset);        //若setAsset()沒有被重寫==100;若setAsset()被重寫==500;
        System.out.println("--------");     

        Son ss = new Son();
        Father ff = ss ;
        ff.setAsset(800);//若setAsset()沒有被重寫,則father.asset = 800;若setAsset()被重寫,則son.asset = 800;
        System.out.println(ss.asset);// 800

        ss.setAsset(900);//若setAsset()沒有被重寫,則father.asset = 900;若setAsset()被重寫,則son.asset = 900;
        System.out.println(ff.getAsset());  //若getAsset()沒有重寫,則==10000;若getAsset()被重寫,則==900
        System.out.println(ss.getFatherAsset());//10000
    }
}

作業(yè)

  1. 使用接口進(jìn)行如下程序設(shè)計(jì)
    個人電腦(PC)具有PCI插槽,可以插入PCI卡。顯卡、聲卡、語音卡都可以作為PCI卡插入PCI插槽中
    PC,PCI,slot,VideoCard,SoundCard, VoiceCard

  2. 高富帥
    Height
    Rich
    Handsome
    Girl boyFriend(HRH h)
    用匿名內(nèi)部類實(shí)現(xiàn)

  3. 使用適配器模式實(shí)現(xiàn)窗口的事件處理程序
    窗口可以響應(yīng)最大化事件、最小化事件、大小改變事件、恢復(fù)事件、移動事件、關(guān)閉事件
    通過適配器對大小改變事件、移動事件和關(guān)閉進(jìn)行默認(rèn)處理,窗口只關(guān)心最大化和最小化事件即可。
    Window
    WindowListener{max min resize restore move close}

  4. 使用抽象類和接口實(shí)現(xiàn)適配器模式設(shè)計(jì)。涉及的類和接口分別為ButtonListener(接口),
    其中含有click() / dbclick() / keyUp() / keyDown()等方法。
    ButtonAdapter(按鈕適配器類),適配器中對非click()方法進(jìn)行默認(rèn)實(shí)現(xiàn)。
    Button類中添加addListener(ButtonListener l)方法。

  5. 闡述什么是多態(tài)。
    為什么函數(shù)可以覆蓋,而屬性不能覆蓋?

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

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

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