帶有繼承和靜態的類的初始化以及載入過程(重要)
阿新 • • 發佈:2018-12-26
package com.google.test;
public class BaseClass {
public void haha(){
printInit(“haha”);
}
private int i = 9;
protected int j;
public BaseClass() {
// TODO Auto-generated constructor stub
System.out.println(“i=” + i + “,” + “j=” + j);
j = 39;
}
private static int x1 = printInit(“1”);
static int printInit(String s) {
// TODO Auto-generated method stub
System.out.println(s);
return 47;
}
void testBaseNormalMethod() {
System.out.println("BaseNormalMethod()");
}
}
package com.google.test;
public class TestClassInit extends BaseClass{
/** 父類程式碼註釋 public class BaseClass { public void haha(){ printInit("haha"); } private int i = 9; protected int j; public BaseClass() { // TODO Auto-generated constructor stub System.out.println("i=" + i + "," + "j=" + j); j = 39; } private static int x1 = printInit("1"); static int printInit(String s) { // TODO Auto-generated method stub System.out.println(s); return 47; } void testBaseNormalMethod() { System.out.println("BaseNormalMethod()"); } }*/ private void testNomalMethod1(){ System.out.println("NomalMethod1()"); } private int k = printInit("3"); public TestClassInit(){ System.out.println("k=" + k); System.out.println("j=" + j); } private int k2 = printInit("4"); private void testNomalMethod2(){ System.out.println("NomalMethod2()"); } public static void main(String[] args) { System.out.println("2"); TestClassInit testClassInit = new TestClassInit(); } private static int x2 = printInit("test"); /** * 步驟如下: * 1.先編譯子類.class載入,看到extents後加載父類,先找靜態的方法得出結果:1(這一步不管子類有沒有建立子類物件都要執行) * 2.父類執行完以後執行子類的靜態方法 * (1.普通靜態方法優先於main方法執行,雖然main方法也是靜態的,2.同樣這一步不管子類有沒有建立子類物件都要執行)得出結果:test ,2 * 3.建立子類物件時候呼叫子類構造方法,子類構造方法預設有一條super()來呼叫父類構造方法,這時候不會呼叫父類構造方法之前的普通方法。 * 得出結果:i=9,j=0。注意:基本型別boolean預設值為false,char預設值為:\u0000,其他全部為0,引用型別預設值為null。 * 4.執行子類從父類繼承下來的靜態方法,然後執行自身的構造方法,得出結果:3,(k=47);4(k2=47) * 5.執行自身的構造方法。得出結果:k=47,j=39 */ /**執行結果: * 1 test 2 i=9,j=0 3 4 k=47 j=39*/
}