<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虛擬機並沒有拋棄那些非繼承成員。
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)
}
}
the bus carrys 40 persons
Car travels at a speed of 90 km