class BaseClass {
int data = 101;
public void print() {
System.out.print(data + " ");
}
public void fun() {
print();
}
}
class SubClass extends BaseClass {
int data = 202;
public void print() {
System.out.print(data + " ");
}
}
class TestClass {
public static void main(String[] args) {
BaseClass obj = new SubClass();
obj.print();//call 1
obj.fun();// call 2
System.out.print(obj.data);//call2
}
}
所以我有一個父/子關係類和一個具有call1,call2,call3的測試類。這些父母和孩子課程的解釋?
1:關於CALL1,我的理由是,由於打印()正在由子類覆蓋和函數調用將打印數據正確的變量。這似乎是正確的,因爲這是正確的答案。
2:現在關於CALL2,因爲好玩的是隻存在於父類,所以呼叫將去那裏,理想情況下應該調用父類和輸出父類的數據變量的樂趣方法。這不是正確的答案,根據答案它輸出數據的孩子類。
誰能給我解釋一下,什麼是錯我的推理?
+1正確的答案,但沒有完成什麼'System.out.print(obj.data);'? –
@SubhrajyotiMajumder該部分很簡單,在實例變量的情況下不存在重寫,而變量指的是對象的原始類型。 – Dude
暗示措辭:「對象的原始類型」有點......奇怪。一個對象只有一個類定義。施工後不能改變。 (當然,一個對象可以有幾種類型,它的定義類,每個超類以及它們實現的每個接口。)你的意思是編譯時的類型分辨率。編譯器只考慮聲明的類型。在這種情況下,變量「obj」的聲明類型是BaseClass。 – Seelenvirtuose