一、多態
多態故名思義,多種狀態。比如Animal 這個類中,eat 方法是 公共的方法,但是當 People,Dog , Cat,繼承時,我們知道人要吃的是米飯,狗要吃的是狗糧,貓要吃的是貓糧。所以當不同類型的引用(不同的對象)調用同一方法時,雖然是同一方法,但是產生的效果卻是不一樣的,這就叫多態
1.1、多態的概念
當不同的引用(不同的對象)調用同一方法時,產生不同的結果
1.2、多態的實現條件(缺一不可)
需要在繼承的前提下 子類需要對父類的方法進行重寫 需要父類的引用調用重寫方法
1.3、多態的好處
比如說以前的手機來電,他只能顯示電話號碼。現在的手機不僅可以顯示電話號碼,還顯示名字,地址。這樣的改變,如果我有多態,就不需要對以前的代碼進行修改,我只需要重新創建一個類,繼承以前的那個類,重寫一下來電顯示那個方法就行 這樣使得代碼的可擴展性更強了
二、重寫
在重寫代碼的前一行,加上@Override,可以讓編譯器幫我們效驗我們重寫得對不對 重寫和重載都是多態的表現
2.1、什么是重寫?
重寫是對父類的方法,在子類中重新寫 在子類中的方法,訪問權限要大于等于父類的,類型要完全相同,方法名要完全一樣,參數列表也要完全一樣
2.2、重寫的規則
子類中的重寫方法的訪問權限要大于等于父類中的 父類中需要重寫的方法不能用 static, private ,final修飾,否則不能重寫,構造方法也不能重寫 子類中的重寫方法的返回值類型可以和父類的不一樣,但是這個返回值類型必須和父類構成繼承關系,這個叫協變類型
2.3、重寫和重載的區別
訪問權限:重寫:要求必須大于或等于父類的訪問權限,重載:要求要相同 返回值類型:重寫:要求要完全一致,重載:不要求 方法名:重寫:要求完全一致,重載:也是要求完全一致 參數列表:重寫:要求完全一致,重載:參數列表必須不同(類型,名字,順序)
2.4、動態綁定
比如說我用 Animal 類,實例化一個Dog 對象(向上轉型),我們知道,animal這個引用雖然指的是Dog,但是animal 的類型是Animal,所以animal這個引用只能調用Animal中的成員,不能調用Dog中特有的成員。換句話說,父類的引用只能調用父類中的成員,不能調用子類的成員。更深層的意思就是,發生了向上轉型不能調用制類特色的成員 什么是動態綁定?動態綁定也叫做運行時綁定。當我用animal調用重寫的方法時,本應該調用的是父類中的方法,但是實際是調用了子類中的重寫方法。這就是動態綁定
class Animal { public void eat ( ) ){ sout ( "父類" + "正在吃飯..." ) }
}
class Dog extends Animal {
@Override public void eat ( ) { sout ( "子類" + "正在吃飯..." ) }
}
class Tect { Animal animal = new Dog (); 因為此時發生了動態綁定animal. eat;
}
同一個引用調用同一個方法,當這個引用 ,引用的對象不一樣的時候,調用方法產生的結果也不一樣,此時我們就把這種思想稱之為多態
2.5、靜態綁定
什么是靜態綁定?靜態綁定也叫做(就是在寫代碼時綁定)編譯時綁定。例子就是重載,跟據所傳入的參數來調用合適的方法 ,此時就發生了靜態綁定。(因為方法名字一樣,所以根據你傳入的參數來綁定要調用的方法,這就叫編譯時綁定)
三、向上轉型和向下轉型
3.1、什么是向上轉型,什么是向下轉型?
Animal animal = new Dog ( ) ;
Dog dog = ( Dog ) new Animal ( ) ;
3.1.2、在向上轉型中兩個類型不一樣,為什么不需要強制類型轉換?
可以這么說,狗一定是動物,但動物不一定是狗,所以向下轉型需要強轉
3.2、使用場景
Animal animal = new Dog ();
public static void get(Animal animal){ animal. draw ( ) ;
}
Dog dog = new Dog ( ) ;
get ( dog) ;
public Animal get(){ return new Dog ();
}
3.3、需要注意什么?
向上轉型和向下轉型,其實都是為了類型的統一 向下轉型需要注意,因為動物不一定是狗。所以可以使用 instanceof 關鍵字來讓編譯器效驗是不是強轉的類型,即用該關鍵字驗證animal 所指的對象是不是狗,這樣使用instanceof 保證了向下轉型的安全性
Animal animal = new Dog ();
if ( animal instanceof Dog ) { Dog dog1 = ( Dog ) animal;
} else if ( animal instanceof Cat ) { Cat cat = ( Cat ) animal;
}
四、避免在構造方法中調用重寫方法