Java三大特性之多型
目錄- Java三大特性之多型
- 多型概述
- 背景知識
- 強制型別轉換(cast)
- 向上轉型(upcasting)and 向下轉型(downcasting)
- 知識點詳述(實體)
- 多型-使用場景
- 訪問方式
- 多型的優點
- 小結
多型概述
Java有三大特性:封裝、繼承和多型,
? 那么什么是多型呢?所謂多型就是指程式中定義的參考變數所指向的具體型別和通過該參考變數發出的方法呼叫在編程時并不確定,而是在程式運行期間才確定,即一個參考變數倒底會指向哪個類的實體物件,該參考變數發出的方法呼叫到底是哪個類中實作的方法,必須在由程式運行期間才能決定,
? 因為在程式運行時才確定具體的類,這樣,不用修改源程式代碼,就可以讓參考變數系結到各種不同的類實作上,從而導致該參考呼叫的具體方法隨之改變,即不修改程式代碼就可以改變程式運行時所系結的具體代碼,讓程式可以選擇多個運行狀態,這就是多型性,
? 簡單來說就是根據不同情況呼叫不同的方法,
背景知識
在了解多型之前,讓我們先了解一下型別轉換,因為多型本身是一種向上轉型,
強制型別轉換(cast)
double Steve_speed = 233.33;
int now_Steve_speed = (int) Steve_speed;
向上轉型(upcasting)and 向下轉型(downcasting)
public class Minecraft {
public void sleep() {
System.out.println("Set time night.");
}
public static void main(String[] args) {
Steve m = new Steve();
m.sleep();
Minecraft h = new Steve();// (1)向上轉型
h.sleep(); // (2)動態系結
// h.speak(); // (3)此方法不能編譯,報錯說Minecraft類沒有此方法
// // [1]向下轉型
// Steve m2 = new Steve();
// Minecraft h2 = m2;
// m2 = (Steve) h2;
// m2.speak();
//
// // [2]向下轉型:失敗
// Minecraft h3 = new Minecraft();
// Steve m3 = (Steve)h3;
// m3.speak(); //此時會出現運行時錯誤,所以可以用instanceOF判斷
//
// // [3]向下轉型:型別防護
// Minecraft h4 = new Minecraft();
// if (h4 instanceof Steve){ // 因為h4不是Steve的實體,所以不執行if內部代碼
// Steve m4 = (Steve)h4;
// m4.speak();
// }
}
}
class Steve extends Minecraft {
@Override
public void sleep() {
System.out.println("Steve sleep.");
}
public void speak() {
System.out.println("I am Steve.");
}
}
class Alex extends Minecraft {
@Override
public void sleep() {
System.out.println("Alex sleep.");
}
public void speak() {
System.out.println("I am Alex.");
}
}
- 這里要注意:
- 向上轉型不要強制轉型
- 父類參考指向的或者呼叫的方法是子類的方法,這個叫動態系結
- 向上轉型后父類參考不能呼叫子類自己的方法
知識點詳述(實體)
多型性(Polymorphism): 向上轉型
? 在搜索資料的程序中,發現有人說 :多載也是一種多型,不過是一種特殊的多型,是編譯時決定的靜態多型,但網上又有人說多載是多型的靜態系結,重寫是多型的動態系結,
? 其實java里方法被封裝后也可以是物件,多型的必要條件雖然可以理解是繼承和重寫,但多型分為行為(方法)多型和物件多型,行為多型是重寫和多載,物件多型是向上下轉型, 簡單的說,重寫是父類與子類之間多型性的體現,而多載是一個類的行為的多型性的體現,
而我們平常講的Java的三大特性之多型多指多型的動態系結,有三個必要條件:
- 繼承
- 重寫
- 父類參考指向子類物件(向上轉型)
public class Minecraft {
public static void main(String[] args) {
Mineral p = new Iron();
p.mine();
// 呼叫特有的方法
Iron s = (Iron) p;
s.broked();
// ((Iron) p).broked();
}
}
class Mineral {
public void mine() {
System.out.println("礦物");
}
}
class Iron extends Mineral {
@Override
public void mine() {
System.out.println("鐵礦");
}
public void broked() {
System.out.println("石鎬可以破壞它");
}
}
class Diamond extends Mineral {
@Override
public void mine() {
System.out.println("鉆石");
}
public void what() {
System.out.println("掉落鉆石");
}
}
-
輸出:
-
鐵礦 石鎬可以破壞它
多型-使用場景
多型:基型別物件訪問派生類重寫的方法
訪問方式
- 回圈呼叫基類物件,訪問不同派生類方法
- 自定義函式,實參是派生類,行參是基類
多型的優點
- 消除型別之間的耦合關系
- 可替換性
- 可擴充性
- 介面性
- 靈活性
- 簡化性
小結
? 多型雖然有點難以理解,但其特性動態系結在實際專案中非常有用,能減少很多繁雜的代碼,減輕作業量的同時,其靈活性也大大提高了代碼的擴展性,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/403513.html
標籤:Java
上一篇:快速上手SpringMVC
