class Father{
String member = "father";
}
class Son extends Father{
String member = "son";
String member2 = "son2";
}
public class test{
public static void main(String[] args){
Father f = new Son(); //父類的引用指向子類的對象
System.out.print(f.member);//輸出爲father,若想輸出子類的成員變量,則要((Son)f).member
f.member2;//編譯不通過,因爲f引用指向的是Son對象,雖然Son有member2成員變量,但是編譯時系統並不知道,系統只能根據引用類型來判斷,引用類型沒有該成員就會編譯報錯。
}
}
引用只能調用其所在類具有的成員,不能調用子類特有的成員。
但是,方法的調用與此相反,是按對象的類型調用,與引用類型無關,調用的是具體對象所在類中的方法。
靜態方法不能被重寫,可以被繼承。子類“重寫”父類的靜態方法時也只能寫成靜態的,其實質是將父類的靜態方法隱藏,而不是重寫。在這種情況下是根據引用類型來進行調用,與重寫不同(根據對象類型調用)
public class Test extends Parent {
public static void main(String[] args) {
Test t = new Test();
t.t2(3);
//這種情況下,區分重寫(覆蓋)的區別。覆蓋調用子類的方法,重載只調用父類的方法
Parent t3 = (Parent) t;
t3.t2(3);//即使子類有更匹配的t2(int),但是這裏只能調用父類自己的方法,沒有就會報錯
}
public void t2(int a) {
System.out.println("子類t2的int a==" + a);
}
}
class Parent {
public void t2(double a) {
System.out.println("父類t2的double a==" + a);
}
public void t2(String s){
System.out.println("父類t2的String s==" + s);
}
}
輸出:
子類t2的int a==3
父類t2的double a==3.0
設Ia與Ib均爲接口,類A實現了Ia,
Ia a = new A();
Ib b = (Ib)a;
任何兩個接口都能相互強轉,編譯不會出錯;但是若類A沒有直接或間接實現Ib,運行時會出錯。