polymorphism多態(tài)-java三大特性
/**
* 測(cè)試多態(tài) polymorphism 方法的多態(tài)
*/
public class TestPolymorphism {
? ?void eat(){
? ? ? ?System.out.println("各國(guó)人的吃飯方式");
? ? ? ?//父類(lèi)的方法
? ?}
}
class Chinese extends TestPolymorphism{
? ?void eat(){
? ? ? ?System.out.println("用筷子");
? ? ? ?//子類(lèi)重寫(xiě)
? ?}
? ?void drink(){
? ? ? ?System.out.println("喝茶");
? ?}
}
class American extends TestPolymorphism{
? ?void eat(){
? ? ? ?System.out.println("用叉子");
? ?}
}
class TestPoly{
? ?static void pe(TestPolymorphism p){
? ? ? ?//靜態(tài)方法屬于類(lèi),在類(lèi)內(nèi)可直接調(diào)用,不依附于對(duì)象名.
? ? ? ?p.eat();
? ?}
? ?public static void main(String[] args) {
? ? ? ?pe(new TestPolymorphism());
? ? ? ?//new一個(gè)父類(lèi)對(duì)象,調(diào)用父類(lèi)的eat
? ? ? ?pe(new Chinese());
? ? ? ?//new一個(gè)子類(lèi)對(duì)象 (形參)p = new Chinese() ?父類(lèi)引用p 指向子類(lèi)對(duì)象Chinese() 稱(chēng)為向上轉(zhuǎn)型
? ? ? ?//執(zhí)行p.eat()時(shí) p指向子類(lèi)對(duì)象 變成子類(lèi)對(duì)象.eat()
? ? ? ?pe(new American());
? ? ? ?//父類(lèi)引用p(形參)指向父類(lèi)或不同的子類(lèi) 調(diào)用各自重寫(xiě)的方法 形成多態(tài)
? ? ? ?TestPolymorphism p1 = new Chinese();
? ? ? ?p1.eat();
? ? ? ?//執(zhí)行時(shí)p1指向子類(lèi)對(duì)象 變成子類(lèi)對(duì)象.eat()
? ? ? ?//無(wú)法調(diào)用p1.drink(); 首先判定父類(lèi)p1.drink() 父類(lèi)沒(méi)有drink方法 此時(shí)還沒(méi)到p1指向子類(lèi)對(duì)象的步驟
? ? ? ?//TestPolymorphism p1為編譯類(lèi)型 ? ? new Chinese()為運(yùn)行時(shí)類(lèi)型
? ? ? ?//父類(lèi)引用變量p1只能調(diào)用編譯類(lèi)型TestPolymorphism的方法 不能調(diào)用運(yùn)行時(shí)類(lèi)型Chinese的方法
? ? ? ?TestPolymorphism p2 = new Chinese();
? ? ? ?//父類(lèi)引用p2 ?指向子類(lèi)對(duì)象 ?稱(chēng)為向上轉(zhuǎn)型
? ? ? ?Chinese c = (Chinese) p2;
? ? ? ?//子類(lèi)引用c 指向父類(lèi)編譯類(lèi)型p2 稱(chēng)為向下轉(zhuǎn)型 需要用(類(lèi)名)強(qiáng)制轉(zhuǎn)換
? ? ? ?c.drink();
? ? ? ?//p2.drink();依然報(bào)錯(cuò)
? ? ? ?((Chinese)p2).drink();
? ? ? ?//(Chinese)p2強(qiáng)制轉(zhuǎn)換后可用drink()
? ? ? ?//原對(duì)象仍然是Chinese類(lèi) p2仍然是TestPolymorphism類(lèi) c是Chinese類(lèi)
? ? ? ?if(p2 instanceof American){
? ? ? ? ? ?//判斷p2是否屬于A(yíng)merican類(lèi)
? ? ? ? ? ?American a2 = (American) p2;
? ? ? ? ? ?//由于Chinese類(lèi)不屬于A(yíng)merican類(lèi) 雖然編譯時(shí)可以強(qiáng)制轉(zhuǎn)換 但運(yùn)行時(shí)會(huì)報(bào)錯(cuò)
? ? ? ? ? ?//添加if語(yǔ)句判斷instanceof 為false即不執(zhí)行
? ? ? ? ? ?a2.eat();
? ? ? ?}
? ?}
}