1. 程式人生 > >java語言機制中的多型多型理解以及多型的向上轉型和向下轉型問題

java語言機制中的多型多型理解以及多型的向上轉型和向下轉型問題

多型中轉型問題往往不容易理解,特別是向上和向下轉型。

下面先說說多型的概念和前提:

1.要有繼承關係;

2.要有方法重寫;

3.要有父類引用指向子類物件;

如果是成員變數的話,編譯看左邊(父類),執行看左邊(子類);

如果是成員方法的話,編譯看左邊(父類),執行看右邊(子類);

如果是靜態方法的話,編譯看左邊(父類),執行看右邊(子類);

下面有一個例子可以說明:(輸出結果為John和談幾個億的大單子)

基本資料型別的自動提升和強制型別轉換的區別:

        從基本資料型別出發,其實就可以類似地可以得出,多型中的父類引用指向子類物件實際上就是向上轉型;二也有多型向下轉型;

向下轉型的話就是要加上前面的轉型符號;(我想了一下,還是從最簡單的基本型別進行對比來看比較好)

public class Job {
 
	public static void main(String[] args) {
		
		System.out.println("我的工作是:");
	}
 
	public void say() {
		System.out.println("工作");
	}
 
}

先建一個job類,Job類的方法是say

再新增兩個類,Teacher和Student,都繼承Job;


public class Teacher extends Job{
 
	public static void main(String[] args) {
		System.out.println("老師");
	}
 
}
public class Student extends Job{
	 
    public void say() {
        System.out.println("學生");
    }
   
}

 

最後再寫個Test類來例項化呼叫

 

下面我們來測試下多型父類指向子類具體實現

 

public class Test {
    
	public static void main(String[] args) {
		/*父類指向Student類的具體實現
		 * 由子類Student指向父類Job,向上轉型
		 * */
	    Job job = new Student();
		job.say();
		
		/*向下轉型
		 * 由Student轉向job,按照提示新增在job前新增(Student)
		 * */
		Student student = (Student) job;
		student.say();
		
		/*向下轉型,因為job指向的是Student具體實現,
		所以會報錯*/
		Teacher teacher = (Teacher) job;
		teacher.say();
	}
}

輸出結果:

從Test類我們可以理解到多型中轉型的含義(具體的看Test類中註釋)

 

向上轉型:子類物件->父類物件 安全

向下轉型:父類物件->子類物件 不安全

下面用一個例子來解釋向下轉型的不安全性:

向上轉型和向下轉型都是java多型性的一種體現手段,只是向上轉型不用強制轉換

向上轉型即父類引用指向子類物件

Gril是父類,漂亮女孩MMGril是子類

那麼,

Girl g1=new MMGirl(); //向上轉型

       MMGirl mmg=(MMGirl)g1; //向下轉型,編譯和執行皆不會出錯

此時mmg指向的實際上還是子類漂亮女孩物件MMGirl,所以這裡的向下轉型是安全的。因為g1指向的是子類物件。


Girl g2=new Girl();
MMGirl mmg1=(MMGirl)g2; //不安全的向下轉型,編譯無錯但會執行會出錯,此時mmg1指向的是由父類物件Girl強制轉換成的假MMGirl物件

試想,每個女孩Girl都會笑,但是漂亮女孩MMGirl具有蠱惑男人的微笑但是普通女孩沒有

現在我把一個普通女孩強制轉換成了MMGirl,雖然面子上過去了(表現為能編譯)但是她不具備勾人心魄的微笑呀!(這就是不安全的體現)

能理解了吧?