第五周動手動腦(2018.10.15-10.21)
問題一:
早期經常這樣定義變量: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)