在Java中,測試
當一個類被調用的時候,它的初始化過程是怎麼樣的呢?spa
當一個類被實例化的時候,它的初始化過程又是怎樣的呢?code
爲何static方法不能未經對象就調用非static方法?對象
下面咱們經過例子來找出答案。blog
public class ClassLoadingTest { static String staticString=getStaticString(); //靜態成員變量 private String privateString=getPrivateString();//普通成員變量 public ClassLoadingTest() { System.out.println("Loading ClassLoadingTest()"); } public static void loadStaticMethod() { System.out.println("Loading static method"); } private void loadNotStaticMethed(){ System.out.println("Loading NotStaticMethed"); } private String getPrivateString() { String string=new String("Loading private variable"); System.out.println(string); return string; } private static String getStaticString() { String string=new String("Loading static variable"); System.out.println(string); return string; } public static void main(String[] args) { loadStaticMethod(); //加載靜態方法 System.out.println("try to new ClassLoadingTest()"); ClassLoadingTest test=new ClassLoadingTest(); test.loadNotStaticMethed();//加載普通方法 } }
Loading static variable
Loading static method
try to new ClassLoadingTest()
Loading private variable
Loading ClassLoadingTest()
Loading NotStaticMethed
當一個類沒有父類的時候,加載順序爲:get
靜態成員變量/靜態方法-->開始實例化-->普通成員變量/普通方法-->構造方法-->實例化結束。string
父類:class
public class ClassLoadingTestSuper { static String staticString=getSuperStaticString(); //父類的靜態成員變量 private String privateString=getSuperPrivateString(); //父類的普通成員變量 public ClassLoadingTestSuper() { System.out.println("Loading ClassLoadingTestSuper()"); } private String getSuperPrivateString() { String string=new String("Loading super class private variable"); System.out.println(string); return string; } private static String getSuperStaticString() { String string=new String("Loading super class static variable"); System.out.println(string); return string; } }
子類:test
public class ClassLoadingTest extends ClassLoadingTestSuper { /*內容與ClassLoadingTest相同*/ }
Loading super class static variable Loading static variable Loading static method try to new ClassLoadingTest() Loading super class private variable Loading ClassLoadingTestSuper() Loading private variable Loading ClassLoadingTest() Loading NotStaticMethed
當該類有父類的時候,類的實例化的加載過程是:變量
父類的static成員變量和方法-->該類的static變量和方法-->開始實例化-->父類的普通成員變量和方法-->父類的構造方法-->該類的普通成員變量和方法-->該類的構造方法-->實例化結束。