Java面向物件程式設計——多型性:方法、物件的多型性
阿新 • • 發佈:2020-12-19
多型性是面向物件程式設計中四大特性之一,多型性是在繼承性的基礎上擴展出來的概念,可以實現父子類之間的轉換處理。
在Java中主要有方法的多型性和物件的多型性。
方法的多型性:方法實現不同的功能
>>>方法的過載:同一個名稱的方法可以根據傳入的引數型別和個數的不同而實現不同的功能的執行。
>>>方法的覆寫:同一個名稱的方法可能根據子類的不同有不同的實現。
物件的多型性:父子類之間的轉換處理
>>>物件向上轉型:父類 父類例項=子類例項 //自動完成轉型
比如有以下程式:
class Person{ public void getInfo(){ System.out.println("人類"); } public Person(){ } } class child extends Person { @Override public void getInfo(){ System.out.println("孩子"); } public child(){ } } class man extends Person { @Override public void getInfo(){ System.out.println("男人"); } } public class Demo{ public static void main(String args[]){ print(new child()); print(new man()); } public static void print(Person msg){ msg.getInfo(); } }
執行結果:
從上面結果我們就可以知道,物件向上轉型的優點就是對於引數可以進行統一的設計,向上描述的是一些公共的特性。
當然我們上面的注方法程式碼可以如下設計,也可以實現同樣的功能。
public class Demo{ public static void main(String args[]){ print(new child()); print(new man()); } public static void print(child msg){ msg.getInfo(); } public static void print(man msg){ msg.getInfo(); } }
但是,當我們Person類的子類特別多的時候,是不是要新增特別多的重複程式碼?這樣對程式的維護是不是更加困難?所以我們需要使用物件向上轉型。
>>>物件向下轉型:子類 子類例項=(子類)父類例項 //強制完成轉換
比如以下程式:
class Person{ public void getInfo(){ System.out.println("普通人-----呼吸、吃飯、睡覺"); } public Person(){ } class man extends Person { public void getInfo1(){ System.out.println("男人---賺錢、上班"); } } public class Demo{ public static void main(String args[]){ Person per=new man(); per.getInfo(); man per1=(man)per; per1.getInfo1(); } }
執行結果:
從上面結果我們可以看出,向下轉型的主要特點在於需要使用到一些子類自己特殊的定義,描述的是一些稀有的特殊的特性。
但是物件向下轉型不是一件安全的事,比如以下程式:
public class Demo{
public static void main(String args[]){
Person per=new Person();
per.getInfo();
man per1=(man)per;
per1.getInfo1();
}
}
執行結果:
從結果可以知道,從一個沒有物件向上轉型的物件直接進行物件向下轉換是會出現異常的,因此一定要謹慎。從實際的處理來看,大部分情況都是考慮物件的向上轉型,在使用子類特殊功能(子類可以對父類進行功能擴充)的時候,要採用向下轉型。
為此,我們在進行物件向下轉型的過程中會判斷某個例項是否是某個類的物件,這就需要使用instanceof語法來實現了。
基本語法:物件 instanceof 類 返回值為true 或 false
比如以下程式:
public class Demo{
public static void main(String args[]){
Person per=new Person();
System.out.println(per instanceof Person);
}
}
其結果直自然就是True了。