昨天內容回顧:
1、繼承中成員變量、成員方法、構造方法的訪問特點
成員變量訪問特點:就近原則,在方法中,如果有同名的局部變量就是訪問局部變量,如果沒有同名的局部變量就訪問本來同名的成員變量,如果本類沒有
同名成員變量就訪問父類同名的成員變量,如果父類也沒有,那麼就編譯報錯。
this.變量名:訪問本類成員變量
super.變量名:訪問父類成員變量
成員方法的訪問特點:
super.方法名(...)訪問父類的方法。
構造方法的訪問特點:
1、創建子類對象都會先創建父類對象,初始化父類中的成員變量,因爲子類需要繼承下來,可能會使用到。
2、在子類構造方法中使用 super(...)可以訪問父類的對應構造方法,但是super(...)只能放在第一行。
2、方法的重寫
子類中定義了和父類一樣的方法就是方法重寫,也叫方法覆蓋。
3、final和static關鍵字
final:最終的
final修飾類:類不能被繼承
final修飾變量:修飾的變量是常量,不能被重新賦值。
final修飾方法:不能被重寫。
static:靜態的
1、靜態修飾的內容屬於類不屬於某個對象,被所有對象共享,直接通過類名就可以訪問。例如:類名.靜態變量名,類名.靜態方法名()
2、靜態方法內只能訪問靜態的內容(靜態成員變量和靜態成員方法),訪問非靜態的內容需要先new 對象,然後使用對象調用訪問。
今天內容
1、多態
1 概念:同一個對象,表現出來的不同形態。代碼中:父類 fu=new 子類();
2 多態中成員的訪問特點:
訪問成員變量:編譯看左邊,運行看左邊。輸出的是父類的成員變量值。
訪問成員方法:編譯看左邊,運行看右邊。執行的是子類重寫的方法,如果子類沒有重寫該方法,執行就是父類中的該方法。
3、使用多態的好處
好處:在定義方法時,參數列表中使用父類類型的參數,當調用方法的時候可以傳遞任意子類對象,可以大大簡化代碼書寫,提高程序的擴展性。
public void useAnimal(Animal a){//Animal a=new Cat(); Animal a=new Dog(); Animal a=new Pig();
a.eat();
}
弊端:不能使用多態方式調用子類特有方法。如果需要調用,那麼只能強制類型轉化成子類對象之後再調用
4、類型轉換
/**
* 飼養員類,操作動物
*/
public class AnimalOperator {
public void useAnimal(Animal a) { //Animal a=new Cat(); Animal a=new Dog()
a.eat();
//需求:如果這個動物是貓,那麼調用貓的特有方法playGame()
//難點:如何判斷a是Cat類型,只有當變量a是Cat類型纔可以將a強轉成Cat。
if(a instanceof Cat){
Cat c= (Cat) a;
c.playGame();
}
}
}
注意:如果類型不一致,那麼強制類型轉換就會出現ClassCastException類型轉換異常。
總結:
多態的體現形式:父類 對象名=new 子類() 記住!!!
好處:能夠提高程序的擴展性和靈活性,具體體現着方法的參數定義上。
弊端:如果需要使用子類特有的方法,那麼就需要強制類型轉換。
強制類型轉換注意:在轉換執行要進行類型判斷。
2、抽象類
概念:如果一個類的子類都必須要重寫某個方法,並且該父類中的這個方法不需要具體的實現,那麼父類的這個方法就可以定義成抽象方法,父類就必須是抽象類
定義格式:使用abstract關鍵字
public abstract class Animal {
public int age=10;
public abstract void eat();
}
抽象類的特點:(可以不用記,因爲違反了一條就編譯報錯)
1、有抽象方法的類一定是抽象類,但是抽象類中不一定有抽象方法。
2、抽象類必須使用多態創建對象: 抽象類 對象名=new 子類();
3、抽象類的子類要麼是抽象類要麼重寫所有的抽象方法。
成員的訪問特點:
1、抽象類中可以有成員變量、常量、靜態成員變量
2、抽象類可以有構造方法,創建子類對象的時候會執行父類構造方法,用於初始化父類成員變量。但是不能直接new抽象類。
3、抽象類可以有抽象的成員方法也可以有非抽象的成員方法。
總結:
爲什麼要使用抽象類?
如果父類中的某些方法不需要具體實現(不需要方法體),並且要求每個子類都要重寫該方法,那麼就可以將該方法定義成抽象方法,
這個父類就需要定義成抽象類。格式如下:
public abstract class 類名{
public abstract void eat();
}
定義子類繼承抽象類,以多態的形式創建對象:抽象類 對象名=new 子類();
3、接口
概念:接口就是用來規定某些類具有的功能(方法)。
語法:public interface 接口名{
}
接口中成員的特點;
成員變量:接口中的成員變量都是常量,默認省略了public static final; 例如:int num=100;
構造方法:接口中沒有構造方法
成員方法:在jdk1.7及以前版本接口中只有抽象方法,但是在1.7版本之後可以有default和static修飾的非抽象方法
類與接口的關係:
類與類:繼承關係,類與類只能單繼承,但是可以多層繼承 public class 類名 extends 父類{} 常見
類與接口:實現關係,類可以實現多個接口 public class 類名 implements 接口1,接口2,...{} 常見
接口與接口:繼承關係:一個接口可以繼承多個接口 public interface 接口名 extends 接口1,接口2,...{} 很少
Java中是允許多繼承,但是隻能是接口和接口之間多繼承。