2013-12-12 46 views
2

子類:行爲靜態塊的抽象類

public class ChildExtending extends ParentAbstract{ 

    public int childInt =111213; 
    static{ 
     System.out.println("child static block executed"); 
    } 

    public ChildExtending() { 
     System.out.println("child const initialized"); 
    } 
    public void MethodInChild(){ 
     System.out.println("MethodInChild called"); 
    } 
    public static void main(String[] args){ 
     System.out.println(ParentAbstract.parentInt); 
     System.out.println(ChildExtending.parentInt); 
    } 
} 

抽象類:

public abstract class ParentAbstract { 
    public static int parentInt=80713; 
    static{ 
     System.out.println("parent static executed"); 
     parentInt=9; 
    } 

    public ParentAbstract(){ 
     System.out.println("parentAbstract initialized"); 
    } 

    public void MethodInParent(){ 
     System.out.println("MethodInParent called"); 
    } 

} 

主要類:

public class MainForCheck { 
    public static void main(String[] args){ 
    /* ParentAbstract pa = new ParentAbstract(){ 

     };*/ 

    /* ChildExtending ce = new ChildExtending(); 
     ce.childInt=5;*/ 

     /*ChildExtending ce = new ChildExtending(); 
     ce.childInt=5; 
     ce.MethodInChild(); 
     System.out.println("pareny int is"+ce.parentInt);*/ 


     ChildExtending ce = new ChildExtending(); 
     ce.MethodInParent(); 

    } 
} 

這給了我輸出:

父靜態執行 ]

孩子靜態塊執行

parentAbstract初始化

孩子常數初始化的

MethodInParent稱爲

爲什麼不是這樣?

父靜態執行

parentAbstract初始化

孩子靜態塊執行

孩子常數初始化

MethodInParent稱爲

回答

7

首先需要初始化ChildExtending(作爲類型)。這將產生輸出

parent static executed 
child static block executed 

根據section 12.4.2 of the JLS

只有一次這種類型初始化可以構造被調用,此時你會得到的輸出:

parentAbstract initialized 
child const initialized 

而且一旦對象被創建,你可以在它調用一個實例方法,輸出:

MethodInParent called 

我認爲你缺少的一塊是該類型必須在構造函數啓動之前完全初始化。構造函數調用不能初始化只需要足夠的超類來調用它的構造函數,然後初始化子類。除了別的以外,如果在超類的構造函數中調用getClass(),那必須是完全初始化的類 - 它必須是子類,因爲這就是對象的一個實例。

+0

明白了......謝謝:) – ALBI

2

每當類負載第一次它的靜態塊始終得到執行第一。所以在這裏,它的父和子的靜態塊被執行,然後實例塊或方法執行