1. 程式人生 > >第三次 動手動腦

第三次 動手動腦

數據 而且 public 構造 不同 als 數據類型 重載 his

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

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

錯誤在於在構造函數時有參數,在調用時沒有填寫int型的參數。

2.根據以下代碼的輸出結果,自行總結Java字段初始化的規律。

public class Test {

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

class InitializeBlockClass{
    
//下面這句在初始化塊之前與之後,會影響到field字段的初始值 //public int field=100; { field=200; } public int field=100; public InitializeBlockClass(int value){ this.field=value; } public InitializeBlockClass(){ } }

輸出結果:在初始化之後200,300;在初始化在前100,300.

規律:1)執行類成員定義時指定的默認值或類的初始化塊,到底執行哪一個要看哪一個“排在前面”

2)執行類的構造函數

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

3.運行TestStaticIniitializeBlock.java示例,觀察輸出結果,總結“靜態初始化塊的執行順序”。

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)創建子類型的對象時,也會導致父類型的靜態初始化塊的執行。

4.一個有趣的問題

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

請編寫代碼驗證你的想法

class Test{
    static int num;
    int qwe;
    static void foo() {
        num=0;
        Test t=new Test();
        t.qwe=0;
    }
}

5.Interger類的裝箱和拆箱到底是怎樣實現的?

裝箱,自動根據數值創建對應的 Integer對象;拆箱,自動將包裝器類型轉換為基本數據類型。

6.兩對整數明明完全一樣,為何一個輸出true,一個輸出false?

public class Test 
{
    public static void main(String[] args)
    {
        Integer i1=100;
       
        Integer j1=100;
        
        System.out.println(i1==j1);

        
        Integer i2=129;
        
        Integer j2=129;
        
        System.out.println(i2==j2);
    }
}

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

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

第三次 動手動腦