2017-04-22 28 views
1

這個問題在接受記者採訪時問。 據我first.Then主要執行它調用B類,其內部調用A類的構造函數(因爲超類)的構造函數中的靜態變量初始化。我想知道什麼時候分配的實例變量的內存是什麼,並且總是從超類到子類的程序流?這個程序關於內存分配的確切流程是怎樣的?

Class A(){ 

    int a = 10; 

    static int b = 20; 

    //constructor 

    A(){} 

} 

Class B extends A{ 

    int c = 30; 

    static int d = 40; 


    B(){} 


    public static void main(String args[]){ 

     B b = new B(); 

    } 

} 
+0

閱讀https://docs.oracle.com/javase/tutorial/java/javaOO/index.html,特別是「提供的構造你的類」部分 – hagrawal

回答

0

回答第一個問題:我想知道到底是分配實例變量的存儲實際上,如果我們看一下反編譯代碼很容易。假設一個更瑣碎類:

public class Test { 

    public Test(){ 
    } 

    int i = 3; 
} 

反編譯代碼(javap -c -p Test.class)會顯示這樣的事情:

0: aload_0 
    1: invokespecial #10 // Method java/lang/Object."<init>":()V 
    4: aload_0 
    5: iconst_3 
    6: putfield  #12 // Field i:I 
    9: return 

即使它不會告訴你太多,事情從這裏得到的,是實例字段的初始化放入構造函數中,所以這是它發生的時間。

事情是有點不同的,當你有一個靜態字段

public class Test { 

    static int j = 5; 

    int i = 3; 
    } 

將會有一個生成的靜態代碼塊,並在構造函數之前執行:

static {}; 
    Code: 
    0: iconst_5 
    1: putstatic  #11 // Field j:I 
    4: return 

第二個問題:是程序總是子類流從超類是相當容易的事,一旦你UND erstand一個構造函數中的第一個電話是總是一個在你的榜樣,以super通話。所以B constructor實際上看起來是這樣的:你初始化B

B(){ 
    super(); 
    ... rest of code 
} 

所以之前,你居然叫A constructor,這反過來將調用Object constructor(因爲每個人都從Object繼承)。