java課後思考題(三)
1.以下代碼為何無法通過編譯?哪兒出錯了?
因為在Foo類中已經有了一個Foo類的有參構造函數,所以Foo類中已經不默認Foo()的無參構造函數,所以在new Foo()時無法調用構造函數。所以在無法通過譯。可以再在Foo類中寫一個無參構造函數,這樣在new Foo()時,就可以通過編譯。
2.使用上頁幻燈片中定義的類,以下代碼輸出結果是什麽?
結果截圖:
java字段初始化的規律:所有類的變量都默認初始化為null,比如String a,Integer b;數字類的原始數據類型默認初始化為0,比如int a,short b,char c;boolean 默認初始化為false。Java進行初始化的地方有兩個:初始化塊和構造函數,其中初始化塊又分為靜態初始化塊和實例初始化塊。靜態初始化塊是類中由static修飾的初始化塊,實例初始化塊為類中沒有任何關鍵字修飾的初始化語句。如果在主函數中創建對象時沒有形參時,如果在類中定義了公共的變量並給與了賦值,那麽就會把值賦給主函數中的變量,再調用類中的默認構造函數,如果在主函數中創建對象時有形參,則調用類中對應的構造函數。
3.請運行TestStaticInitializeBlock.java示例,觀察輸出結果,總結出“靜態初始化塊的執行順序”。
結果截圖:
所有的靜態初始化塊都優先執行,其次才是非靜態的初始化塊和構造函數,它們的執行順序是:父類的靜態初始化塊>子類的靜態初始化塊>父類的初始化塊>父類的構造函數>子類的初始化塊>子類的構造函數.
4.靜態方法中只允許訪問靜態數據,那麽,如何在靜態方法中訪問類的實例成員(即沒有附加static關鍵字的字段或方法)?
public class A {
public static void main(String[] args) {
A a=new A();
System.out.println("value="+a.AB());
}
static int AB() {
A a=new A();
int value=a.AC();
return value;
}
int AC() {
int value=1;
return value;
}
}
結果截圖:
5.兩對整數明明完全一樣,為何一個輸出true,一個輸出false?
原因:
java在通過valueOf方法創建Integer對象的時候,如果數值在[-128,127]之間,便返回指向IntegerCache.cache中已經存在的對象的引用;否則創建一個新的Integer對象。i1和j1的數值為100,因此會直接從cache中取已經存在的對象,所以i1和i2指向的是同一個對象,而i2和j2則是分別指向不同的對象。"=="符號在比較對象的時候是比較的內存地址,而對於原始數據類型是直接比對的數據值。
java課後思考題(三)