1站削、概述
多態(tài)就是描述一個事物的多種形態(tài),如小明是一個學生,他既是人,也是學生倍奢,出現(xiàn)兩種形態(tài)捶闸。Java中多態(tài)的代碼體現(xiàn)在一個子類對象(實現(xiàn)類對象)既可以給這個子類(實現(xiàn)類對象)引用變量賦值拷沸,又可以給這個子類(實現(xiàn)類對象)的父類(接口)變量賦值。
2椭符、多態(tài)的定義與使用格式
父類的引用變量指向子類對象:父類類型 變量名 = new 子類類型();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??變量名.方法名()耻姥;
普通類多臺定義格式:父類 變量名 = new 子類()销钝;
class Fu {}? ? //創(chuàng)建父類
class Zi extends Fu {}? ? //創(chuàng)建子類
Fu f = new new Zi();? ? //類的多態(tài)使用
抽象類定義多態(tài)格式:?抽象名 變量名 = new 抽象子類();
//創(chuàng)建抽象父類
abstract class Fu
{
? ? public abstract void fun();
}
//創(chuàng)建子類重寫父類抽象方法
class Zi extends Fu
{
? ? public void fun()
? ? {
? ? ? ? System.out.println("重寫父類抽象方法");
? ? }
}
//抽象類的多態(tài)使用
Fu f = new Zi();
接口多態(tài)定義的格式:接口 變量名 = new 接口實現(xiàn)類()琐簇;
//創(chuàng)建接口
interface Fu
{
? ? public abstract void fun();
}
//創(chuàng)建實現(xiàn)類
class Zi implements Fu
{
? ? public void fun()
? ? {
? ? ? ? System.out.println("重寫接口抽象方法");
? ? }
}
//接口的多態(tài)使用
Fu f = new Zi();
3蒸健、多態(tài)的特點
?????必須有父子類關(guān)系或類實現(xiàn)接口關(guān)系,否則無法完成多態(tài)
????必須重寫父類或接口類方法
????父類引用變量指向子類對象
????父類引用變量調(diào)用方法時婉商,會調(diào)用子類重寫后的方法
4似忧、多態(tài)成員的特點
????成員變量在編譯時,參考的是引用類型所屬的類(父類)中是否有被調(diào)用的成員變量丈秩。沒有則編譯失敗盯捌。
????成員變量在運行時,參考的也是引用類型所屬的類(父類)中是否有被調(diào)用的成員變量蘑秽。沒有則運行失敗饺著。
??????????? 即:編譯和運行都是看等號的左邊(父類)
????成員方法編譯時,參考引用變量所屬的類(父類)筷狼,如果類中沒有調(diào)用的方法瓶籽,編譯失敗
????成員方法運行時匠童,參考引用變量所指的對象所屬的類(子類)埂材,并運行對象所屬類中的方法
??? ????????即:編譯看左邊(父類),運行看右邊(子類)
邏輯實例:
//創(chuàng)建父類
public class Fu {
? ? int num = 1;? ? //定義成員變量
? ? public void fun()? //定義成員方法
? ? {
? ? ? ? System.out.println("父類");
? ? }
}
//創(chuàng)建子類
public class Zi extends Fu {
? ? int num = 2;
? ? public void fun()
? ? {
? ? ? ? System.out.println("子類");
? ? }
}
//main中調(diào)用
public class Main {
? ? public static void main(String[] args)
? ? {
? ? ? ? Fu f = new Zi();
? ? ? ? System.out.println(f.num);? ? ? //成員變量編譯和運行都是參考父類的
? ? ? ? f.fun();? ? ? ? //成員方法編譯參考父類汤求,運行參考子類
? ? }
}
運行結(jié)果:
1
子類
5俏险、instanceof 關(guān)鍵字?
作用:instanceof 關(guān)鍵字用來判斷某個對象是否屬于某種數(shù)據(jù)類型
格式:boolean b = 對象 數(shù)據(jù)類型;
//兩個子類扬绪,使用兩次多態(tài)調(diào)用
Animal a1 = new Cat();
Animal a2 = new Dog();
boolean flag = a1 instanceof Cat;? ? //flag結(jié)果為true
boolean flag2 = a2 instanceof Cat;? ? //flag2結(jié)果為false
6竖独、多態(tài)轉(zhuǎn)型
向上轉(zhuǎn)型
當子類對象賦值給一個父類引用時,即向上轉(zhuǎn)型(多態(tài)本身就是向上轉(zhuǎn)型的過程)
格式:父類類型 變量名 = new 子類類型()挤牛;
eg:Fu f = new Zi();
向下轉(zhuǎn)型
通過強制類型轉(zhuǎn)換格式莹痢,將父類引用轉(zhuǎn)為子類格式
格式:子類類型 變量名 = (子類類型)父類類型的變量;
eg:Zi z = (Zi) f;??? //變量 f 實際上是指向 Zi 對象
7墓赴、多態(tài)的優(yōu)缺點
優(yōu)點:
????提高了代碼的維護性(由繼承保證)
????提高代碼復用性(有繼承保證)
????提高了代碼的擴展性:新增加的子類不影響已存在類的多態(tài)性竞膳、繼承性以及其他特性
????安全性:向上轉(zhuǎn)型將子類類型隱藏了起來
缺點:
????只能使用父類共性的內(nèi)容,無法使用子類特有的功能(如要使用就要使用向下轉(zhuǎn)型強制類型轉(zhuǎn)換)