1. 程式人生 > >第五周動手動腦(2018.10.15-10.21)

第五周動手動腦(2018.10.15-10.21)

自定義 兩種 靜態方法 不同的 div 演示 觀察 val ima

問題一:

早期經常這樣定義變量:int value=100;

前面的這樣定義:myclass obj=new myclass();

這兩種方式定義的變量是一樣的嗎?

答:當聲明一個對象類型的變量時,實際上並沒有創建一個對象,此變量=null。//myclass obj=new myclass();

定義一個原始類型的變量時,會馬上給其分配內存 //int value=100;

問題二:

對於原始數據類型的變量(比如int),可以直接使用“==”判斷兩變量值是否相等

對象變量也可以使用“==”判斷兩變量值是否相等嗎?

技術分享圖片

運行下面的代碼,得到什麽結果?

技術分享圖片

結果:

技術分享圖片

答:

當“==”施加於原始數據類型變量時,是比較變量所保存的數據是否相等

當“==”施加於引用類型變量時,是比較這兩個變量是否引用同一對象。

引用代表地址,所以“==”實際上相當於比較兩個引用類型變量中保存的對象地址是否相同。

問題三:

以下代碼為何無法通過編譯?哪兒出錯了?

public class Test 
{
public static void main(String[] angs) 
{ Foo objl=new Foo();
}
} 
class Foo{
int value;
public Foo(int initValue) {
	value=initValue;
}
}

  答:構造函數Foo未定義。

結論:如果類提供了一個自定義的構造方法,將導致系統不再提供默認構造方法。

問題四:以下代碼輸出結果是什麽?

class InitializeBlockClass{
{
field=200;
}
public int field=100;
public InitializeBlockClass(int value){
this.field=value;
}
public InitializeBlockClass(){}


public static void main(String[] args) {
InitializeBlockClass obj=new InitializeBlockClass();
System.out.println(obj.field);//?
obj=new InitializeBlockClass(300);
System.out.println(obj.field);//?
}
}

  答:100

300

結論:java字段初始化規律:

Java進行初始化的地方有兩個:初始化塊和構造函數,其中初始化塊又分為靜態初始化塊和實例初始化塊。

靜態初始化塊是類中由static修飾的初始化塊,實例初始化塊為類中沒有任何關鍵字修飾的初始化語句。

如果在主函數中創建對象時沒有形參時,如果在類中定義了公共的變量並給與了賦值,那麽就會把值賦給主函數中的變量,再調用類中的默認構造函數,

如果在主函數中創建對象時有形參,則調用類中對應的構造函數。

類的初始化塊不接收任何的參數,而且只要一創建類的對象,它們就會被執行。因此,適合於封裝那些“對象創建時必須執行的代碼”。

問題五:

運行以下代碼,觀察輸出結果,總結出“靜態初始化塊的執行順序”。

class Root

{

         static{

                  System.out.println("Root的靜態初始化塊");

         }

         {

                  System.out.println("Root的普通初始化塊");

         }

         public Root()

         {

                  System.out.println("Root的無參數的構造器");

         }

}

class Mid extends Root

{

         static{

                  System.out.println("Mid的靜態初始化塊");

         }

         {

                  System.out.println("Mid的普通初始化塊");

         }

         public Mid()

         {

                  System.out.println("Mid的無參數的構造器");

         }

         public Mid(String msg)

         {

                  //通過this調用同一類中重載的構造器

                  this();

                  System.out.println("Mid的帶參數構造器,其參數值:" + msg);

         }

}

class Leaf extends Mid

{

         static{

                  System.out.println("Leaf的靜態初始化塊");

         }

         {

                  System.out.println("Leaf的普通初始化塊");

         }      

         public Leaf()

         {

                  //通過super調用父類中有一個字符串參數的構造器

                  super("Java初始化順序演示");

                  System.out.println("執行Leaf的構造器");

         }

 

}

 

public class TestStaticInitializeBlock

{

         public static void main(String[] args)

         {

                  new Leaf();

         }

}

 答:

 技術分享圖片

靜態初始化塊的執行順序:

1.靜態初始化塊只執行一次。

2.創建子類型的對象時,也會導致父類型的靜態初始化塊的執行。

問題六:

靜態方法中只允許訪問靜態數據,那麽,如何在靜態方法中訪問類的實例成員(即沒有附加static關鍵字的字段或方法)?

答:

public class ButtonFactory

{

private static ButtonFactory instance = null;

public static  ButtonFactory getInstance()

{

    if(null == instance)

           instance = new ButtonFactory();

           return instance;

}

}

  問題七:兩對整數明明完全一樣,為何一個輸出true,一個輸出false?

技術分享圖片

答:在通過valueOf方法創建Integer對象的時候,如果數值在[-128,127]之間,便返回指向IntegerCache.cache中已經存在的對象的引用;否則創建一個新的Integer對象。

  上面的代碼中i1和i2的數值為100,因此會直接從cache中取已經存在的對象,所以i1和i2指向的是同一個對象,而i3和i4則是分別指向不同的對象。

第五周動手動腦(2018.10.15-10.21)