隨堂筆記160314適配器和多態

一、適配器模式

ex:

interface AA{
    void test1();
    void test2();
    void test3();
    void test4();
    void test5();
    void test6();
    void test7();
    void test8();
    void test9();
}

//上面的接口有9個抽象方法,如果我們只需要其中兩個,而用普通的類去實現的話需要把九個都實現,增加工作量

//以下是適配器

abstract class AAA{
    public void test1(){}
    public void test2(){}
    public void test3(){}
    public void test4(){}
    public void test5(){}
    public void test6(){}
    public void test7(){}
    public void test8(){}
    public void test9(){}
}

//我需要用test1(),test2()

class BB extends AAA(){
    public void test1(){
        System.out.println("我實現了test1");
    }

    public void test2(){
        System.out.println("我實現了test2");
    }
}

在一般開發中,如果接口中的抽象方法太多而又用不着所有方法,就可以創建一個適配器,適配器是抽象類,因爲抽象類既可以有抽象方法也可以有實現好了的方法,例如空方法體方法

二、多態

1.定義:某一類事物的多種存在形態

2.代碼:

//多態:父類可以接受子類實例對象
class Fruit{}

class Apple extends Fruit{}

class Banana extends Fruit{}

class Orange extends Fruit{}

class Person{
    public void eat(Fruit obj){
        System.out.println("喫:"+obj);
    }
}

class Test{
    public static void main(String[] args){
        new Person().eat(new Apple());
        new Person().eat(new Banana());
    }
}

編譯通過,因爲Person類中的eat()可以接受Fruit類的實例對象,而Apple、Orange、Banana繼承了Fruit,所以它們三個也可以被eat接收

3.轉型:

  1. java中向下轉型必須先向上轉型:

    Furit f = new Apple();
    Apple a = (Apple)f;

    /*但是不可以這樣做
    Banana b = new Apple();
    畢竟蘋果和香蕉是處於同一級的,而且蘋果不可能轉換成香蕉,無論從生物學來說還是JAVA

4.instanceof()

  1. 這是判斷實例x是否屬於類型a

    Fruit f = new Apple();
    if(f instanceof Apple){
    System.out.println(“水果f是蘋果”);
    Apple a = (Apple)f;
    }
    else{
    System.out.println(“很遺憾,它不是蘋果”);
    }

關於多態的幾點:

  1. 多態可以使形參接收更多類型參數,但不建議使用Object(Object是所有類的根類,用object意爲這個方法可以接收所有類型的參數)
  2. 如果用父類接收子類對象,只能調用父類和子類都有的方法
  3. 如果用父類接收子類對象,調用父類和子類共有的方法時,調用的是子類的方法

關於類設計:

  1. 類的設計主要是父類的設計
  2. 子類永遠不要去繼承一個已經完全實現好了的類,因爲一旦發生向上轉型,所調用的方法一定是被子類覆蓋過的方法,所以只會繼續繼承抽象類或接口
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章