java學習筆記:java的多態,子類和父類的相互轉換,父類引用指向子類的對象

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:24px;">      一</span><span style="font-size:18px;">.在java中可以將子類的引用賦給父類的對象,那麼此時子類中那些不是從父類繼承來的成員將不可見。以下代碼bus 爲car的子類,test類用來測試。</span></span>
package com.example.extendtest;

 class Car {


   void drive(){
	   System.out.println("Car travels at a speed of  90 km");
   }
   void length(){
	   System.out.println("car has travelled 5 hours");
   }
}
package com.example.extendtest;

class Bus extends Car{

   void length(){
	   System.out.println("the bus has travelled 8 hours");
   }
   void carry(){
	   System.out.println("the bus carrys 40 persons");
   }
}
package com.example.extendtest;

public class Test {
public static void main(String args[]){
	Bus bus=new Bus();
	Car car=bus;
	car.length();//(1)
	car.carry();//(2)
	car.drive();//(3)
}
}
1.如果父類中有這個屬性跟方法,子類有重寫過,那麼調用的是子類中的屬性跟方法。
運行test.java中的(1):the bus has travelled 8 hours
2.如果父類中沒有這個屬性跟方法,那麼子類調用就會出錯。
運行test.java中的(2):Exception in thread "main" java.lang.Error: 無法解析的編譯問題:
	沒有爲類型 Car 定義方法 carry()at com.example.extendtest.Test.main(Te(t.java:8)
3.如果父類有這個屬性跟方法,而子類沒有,則調用的是父類的屬性跟方法。
運行test.java中的(3):Car travels at a speed of  90 km
以上結果對於成員變量同樣適用。

二、我們可以通過強制轉換將這個父類在轉換成子類類型,那些不可見的成員又可見了,由此可見,將子類引用給父類時,java虛擬機並沒有拋棄那些非繼承成員。

修改test.java 如下:
package com.example.extendtest;

public class Test {
public static void main(String args[]){
	Bus bus=new Bus();
	Car car=bus;
	Bus bus2=(Bus) car;
	bus2.length();//(1)
	bus2.carry();//(2)
	bus2.drive();//(3)
}
}
重新運行(1)(2)(3):
the bus has travelled 8 hours
the bus carrys 40 persons
Car travels at a speed of  90 km




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章