1. 程式人生 > >java中載入及方法、內部類與成員的呼叫關係

java中載入及方法、內部類與成員的呼叫關係

/*
*該例程測試了程式在最開始時的載入情況及成員的呼叫情況,載入順序為類→靜態成員→建立物件(
*如果建立的話)。
*注意,載入類時,靜態成員是單獨載入到一處static程式碼塊中,後續將不再載入。因此使用效率
*也更高一些。其中,非靜態內部類和靜態內部類在最初均不載入,只有程式中使用兩者時才會進行加
*載,在外部類中,方法和內部類對靜態成員的呼叫情況是一致的,對於方法,靜態方法只可以呼叫靜
*態成員(變數或方法),非靜態方法可以呼叫靜態成員或非靜態成員。當前的理解是,靜態方法在加
*載類時就一起載入了,如果此時在靜態方法中使用了非靜態成員,那麼該非靜態成員是不存在的(未
*分配到記憶體),載入就會出錯,而在非靜態方法中就不會出現該問題(非靜態方法開始不載入)。
*對於內部類來說也是一樣,靜態內部類只可以使用靜態成員,非靜態內部類可以使用靜態成員或非靜
*態成員(該點書中有錯誤),當前的理解是,在非靜態內部類中,會自動建立一個外部類的引用,這
*個引用在程式中是隱藏的。非靜態內部類訪問外部類時就是通過這個引用來達到訪問的目的,但是在
*靜態內部類中是沒有這麼一個引用的,所以靜態內部類是無法訪問非靜態成員的。
*/


/*
 * 在寫測試程式時,遇到兩處錯誤。一是在寫內部類時,當做方法了在內部類的後面添加了"()",
 * 導致編譯出錯,另外一處是,在內部類中呼叫System.out.println()方法列印資訊時,
 * 直接將該語句放在了內部類中,這樣是沒有意義的,必須放在相應的方法中才行,程式設計思想還沒轉換
 * 過來。。
 */


//剛開始接觸JAVA,理解有誤的地方希望大家指出來一起交流~


public class TestClass {
private static int staticvalue = 10;
private int value = 9;
/*構造方法*/
public TestClass(){
System.out.println("呼叫了構造方法!");
}

/*主函式*/
public static void main(String[] args){
System.out.println("進入了main函式!");
/*靜態內部類可直接建立物件,無特殊要求*/
StaticInnerClass staticinnerclass = new StaticInnerClass();
System.out.println("=====分界線=====");
System.out.println("建立了靜態內部類物件,區域性變數值為:"+staticinnerclass.getValue());

/*非靜態內部類需要外部類的引用來建立物件*/
TestClass testclass = new TestClass();
InnerClass innerclass = testclass.new InnerClass();
System.out.println("=====分界線=====");
System.out.println("建立了非靜態內部類的物件,區域性變數值為:"+innerclass.getValue());
}
/*定義了一個靜態方法,用於測試內部類呼叫*/
public static void staticMeth(){
staticvalue = 1;
// value = 2;  //錯誤,不可呼叫非靜態成員
System.out.println("呼叫了靜態方法!");
}

/*定義了一個非靜態方法,用於測試*/
public void Meth(){
staticvalue = 1;
value = 2;
System.out.println("呼叫了非靜態方法!");
}

/*定義一個靜態內部類,用於測試內部類載入順序*/
public static class StaticInnerClass{
int a = 5;
public  StaticInnerClass(){
System.out.println("載入了靜態內部類!");
}

/*靜態內部類中方法*/
public int getValue(){
//staticvalue = 1;
//value = 2;//此處錯誤,不可呼叫非靜態成員
//Meth();  //此處錯誤,靜態內部類不可呼叫非靜態成員
staticMeth();
System.out.println("呼叫了靜態內部類方法!"+staticvalue);
return a;
}
}

/*定義一個非靜態內部類,測試載入順序*/
public class InnerClass{
int b = 3;
public InnerClass(){
System.out.println("呼叫了非靜態內部類!");
}

/*非靜態內部類中的方法,均可呼叫*/
public int getValue(){
staticvalue = 1;
value = 2;
Meth();
staticMeth();
System.out.println("呼叫了非靜態內部類方法!"+staticvalue+value);
return b;
}
}

}