多型
-
面向物件三大特性:封裝性,繼承性,多型性
-
extends繼承或者implements實作是多型的前提
-
一個物件擁有多種形態,即物件的多型性
多型的格式
-
類的多型其實就是指父類參考指向子類物件(子類物件被當作父類)
父類名稱 物件名 = new 子類名稱();對于介面也可寫作:
介面名稱 物件名 = new 實作類名稱();package property; public class Item { String name; int price; public void buy(int price){ System.out.println("使用" + price + "錢購買"); } public void method(String name){ System.out.println("父類方法,使用可以有效"); } } //////////////////////////////// package property; public class LifePotion extends Item { @Override public void method(String name) { System.out.println(name + "可以回血"); } public void LiMethod(){ System.out.println("血瓶特有方法"); } } ///////////////////////////////// package property; public class MagicPotion extends Item{ @Override public void method(String name) { super.method(name); } } /////////////////////////////// package property; public class ItemMutil { public static void main(String[] args) { Item xueping = new LifePotion(); Item lanping = new MagicPotion(); xueping.method("血瓶");//呼叫子類方法 xueping.buy(30);//子類未覆寫重寫時呼叫父類方法 lanping.method("藍瓶"); } }
多型中成員變數和成員方法
-
通過物件名訪問成員變數,等號左邊是誰優先用誰,沒有則向上找
-
通過成員方法訪問成員變數,該方法屬于誰優先用誰,沒有則向上找
-
成員方法訪問規則為,new的是誰優先用誰,沒有則向上找
成員變數:編譯看左邊,運行看左邊
成員方法:編譯看左邊,運行看右邊
物件的轉型
-
向上轉型(多型寫法):
父類名稱 物件名 = new 子類名稱();
-
右側創建一個子類物件,把它當作父類看待使用
- 向上轉型一定是安全的,因為是小范圍轉向了大范圍
-
一旦向上轉型為父類,那么無法呼叫子類特有方法(未覆寫重寫父類的方法),因為編譯不通過
-
向下轉型(還原):
-
子類名稱 物件名 = (子類名稱)父類物件; -
將父類物件還原成原本子類物件
-
向下轉型必須保證,物件轉換為的是原本的子類物件
-
package property;
public class ItemMutil {
public static void main(String[] args) {
Item xueping = new LifePotion();//多型,也是向上轉型
Item lanping = new MagicPotion();
//向下轉型
LifePotion one = (LifePotion)xueping;
one.LiMethod();//向下轉型后可以呼叫子類方法
//向上轉型后向下轉型還原物件
//編譯不會報錯但是運行會報錯,java.lang.ClassCastException
//MagicPotion two = (MagicPotion)xueping;
}
}
-
instanceof關鍵字:
-
物件 instanceof 類名稱 -
判斷物件能不能當作后面型別的實體,將會得到一個boolean結果
-
package property;
public class ItemMutil {
public static void main(String[] args) {
Item xueping = new LifePotion();//多型,也是向上轉型
Item lanping = new MagicPotion();
xueping.method("血瓶");//呼叫子類方法
xueping.buy(30);//子類未覆寫重寫時呼叫父類方法
lanping.method("藍瓶");
useItem(xueping);//可以通過instanceof的方法隨時向下轉型
useItem(lanping);
}
public static void useItem(Item Item){
if(Item instanceof LifePotion){
LifePotion one = (LifePotion)Item;
one.LiMethod();
}
if(Item instanceof MagicPotion){
MagicPotion two = (MagicPotion)Item;
two.MagiMethod();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/161500.html
標籤:Java
上一篇:SpringMVC01_入門案例
下一篇:非常詳盡的 Shiro 架構決議
