11 回答

TA貢獻1817條經驗 獲得超14個贊
子類中定義和父類重名的屬性并不會覆蓋父類的原有屬性,兩者是共存的,父類方法中使用的屬性來自父類定義的,printA雖然在子類中調用,但使用的仍然是父類中的a,想使用子類中的a,可以在子類中重寫這個printA方法

TA貢獻1802條經驗 獲得超10個贊
因為你子類調用的是父類的printA方法, 子類的構造函數中 首先需要實例化父類對象即super(),然后由于你子類沒有重寫父類的printA方法,所以你調用的是父類的方法,父類方法訪問父類的a,所以兩個輸出都是8

TA貢獻1876條經驗 獲得超5個贊
子類使用的是父類方法printA,而這個父類中的prontA所對應使用的參數a是父類中的變量,并不是子類中的
在并沒有重寫父類方法的前提下,是不會進行覆蓋原有父類執行方式的。
建議你斷點調試一下看看~

TA貢獻1772條經驗 獲得超5個贊
讓我幫你梳理一下new sub()后發生了什么,這里不牽扯到多態的問題,是一個純繼承的問題,
1.new sub(),編譯器執行這句話后,先找到sub這個類(并發現sub繼承與sup),然后找到sub的空構造函數,開始執行sub構造函數。
2.但在執行sub構造函數前,必須先執行父類的空構造函數,即輸出第一次8,。
3.父類構造函數執行完后,真正的子類構造函數來了。執行printA(),但是子類沒有重寫父類的printA方法,所以找到父類的printA來執行,這里的a還是父類的a,和子類的a沒有關系,故輸出第二次8。
(繼承不包括私有成員private,這里的a沒有具體些修飾符,默認就是private,所以你的子類并不是重寫了父類的a,而是自己聲明了自己的私有a)
有誤望指正。

TA貢獻1786條經驗 獲得超11個贊
1.new Sub()的時候會調用父類的構造函數,所以會有兩次print
2.printA()是父類的方法,是聲明在Sup這個類里的,System.out.println(a);
打印的a不可能從跨過父親里去找子類的屬性a,因為java沒有這個特性。

TA貢獻1779條經驗 獲得超6個贊
或許你比較一下這個?你應該就知道他們之間的關系了。
// 父類
class Sup {
private int a = 8;
public void printA(){
System.out.println(a);
}
Sup(){
printA();
}
}
//子類
class Sub extends Sup{
Sub(){
super();
printA();
}
public static void main(String[] args) {
new Sub();
}
}
添加回答
舉報