多态性是面向對象程式設計中四大特性之一,多态性是在繼承性的基礎上擴充出來的概念,可以實作父子類之間的轉換處理。
在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了。