一、適配器模式
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.轉型:
java中向下轉型必須先向上轉型:
Furit f = new Apple();
Apple a = (Apple)f;/*但是不可以這樣做
Banana b = new Apple();
畢竟蘋果和香蕉是處於同一級的,而且蘋果不可能轉換成香蕉,無論從生物學來說還是JAVA
4.instanceof()
這是判斷實例x是否屬於類型a
Fruit f = new Apple();
if(f instanceof Apple){
System.out.println(“水果f是蘋果”);
Apple a = (Apple)f;
}
else{
System.out.println(“很遺憾,它不是蘋果”);
}
關於多態的幾點:
- 多態可以使形參接收更多類型參數,但不建議使用Object(Object是所有類的根類,用object意爲這個方法可以接收所有類型的參數)
- 如果用父類接收子類對象,只能調用父類和子類都有的方法
- 如果用父類接收子類對象,調用父類和子類共有的方法時,調用的是子類的方法
關於類設計:
- 類的設計主要是父類的設計
- 子類永遠不要去繼承一個已經完全實現好了的類,因爲一旦發生向上轉型,所調用的方法一定是被子類覆蓋過的方法,所以只會繼續繼承抽象類或接口