1. 程式人生 > >java課後思考題(三)

java課後思考題(三)

ati ima value 內存地址 完全 創建對象 符號 ini 是什麽

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課後思考題(三)