java內存繼承
① java繼承中子父類的關系及內存結構是怎樣的,父類中this表示子類對象,this.屬性怎麼表示父類的屬性
只有非靜態、非終態的方法才有覆蓋和多態一說,靜態方法、終態方法和屬性不存在覆蓋和多態,this出現在哪個類中就輸出哪個類的屬性。
② java 中子類繼承父類的欄位時,佔用的是同一塊內存還是父類和子類對象分別佔用各自的一塊內存,請高人詳答
java語言中的對象採用的堆和棧的形式來存放,例如 Father f = new Father();f存放在棧中,其實只是一個堆內存的地址,真正地對象保存在此地址所指向的堆內存中。
所以你的答案就顯而易見了,Father f = new Father(); Child c = new Child();這里Father是父類,Child是子類,f和c是兩個不同的內存地址,他們的對象保存的地方也不同,所以他們的欄位也不會再同一片內存區域。
如果父類中有個欄位a,子類繼承了父類的這個欄位a,其實就是子類的那個內存區域裡面也會有一個a欄位,父類的內存區域中也有a欄位,他們兩個沒有什麼關系。
③ java 繼承問題 public class Z extens X{ Y y=new Y
隨手寫的代碼吧,關鍵字也能錯。
我覺得你的問題應該是問java類初始化的執行順序。
java類初始化的順序是:
1.靜態屬性
2.靜態自由塊
3.屬性
4.自由塊
6.構造方法
再加上繼承關系,初始化的順序是:
1.父類:靜態屬性
2.父類:靜態自由塊
3.子類:靜態屬性
4.子類:靜態自由塊
5.父類:屬性
6.父類:自由塊
7.父類:構造方法
8.子類:屬性
9.子類:自由塊
10.子類:構造方法
④ 關於Java static 與繼承的執行順序
看完下面的代碼你就明白了……
class Test0 {
public static String staticField = "父類-靜態變數";
public String field = "父類-普通變數";
public Test0() {
System.out.println("父類-構造器");
}
static {
System.out.println(staticField);
System.out.println("父類-靜態初始化塊");
}
{
System.out.println(field);
System.out.println("父類-初始化塊");
}
}
public class Test1 extends Test0{
public static String staticField = "子類*靜態變數";
public String field = "子類*普通變數";
static {
System.out.println(staticField);
System.out.println("子類*靜態初始化塊");
}
{
System.out.println(field);
System.out.println("子類*初始化塊");
}
public Test1() {
System.out.println("子類*子類構造器");
}
public static void main(String args[]) {
System.out.println("main方法");
Test1 test1 = new Test1();
}
}
輸出結果為:
父類-靜態變數
父類-靜態初始化塊
子類*靜態變數
子類*靜態初始化塊
main方法
父類-普通變數
父類-初始化塊
父類-構造器
子類*普通變數
子類*初始化塊
子類*子類構造器
⑤ java繼承類的內存關系
這個問題你可以通過javap命令反編譯發現,在child對象所佔的內存中存放的是實際的變數而非
對parent對象的引用。