1. 程式人生 > >十月21日作業 動手動腦

十月21日作業 動手動腦

(1)

int value=100;

MyClass obj = new MyClass();

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

不一樣,前者int是一種原始資料型別,直接進行定義和初始化就可以了。而後者是通過類名建立物件,再由物件建立物件變數,初始化需要依靠它本身的建構函式。

(2)

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

物件變數也可以使用“==”判斷兩變數值是否相等嗎?

請輸入並執行以下程式碼,得到什麼結果??

package text;

public class Text {

    public static void
main(String[] args) { // TODO Auto-generated method stub Foo obj1=new Foo(); Foo obj2=new Foo(); System.out.println(obj1==obj2); } } class Foo { int value=100; }

得到的答案是一個(flase)

即,==兩邊是基本資料型別時,比較的是值的內容。而當他們是像class這樣的再造資料型別的話,就是比較兩者的地址,即是否是引用的同一物件。

(3)

請輸入並執行以下程式碼,

請總結一下,這個方法有哪些“與眾不同之處”,你能列出幾條?

很明顯,這是一個構造方法,特點如下

1、構造方法名一定與類同名

2、構造方法無返回值型別(void 也不行)

3、構造方法可以沒有(預設一個無參構造方法),也可以有多個構造方法,他們之間構成過載關係

4、如果定義有參建構函式,則無參建構函式將被自動遮蔽

5、構造方法不能被繼承

6、構造方法不能手動呼叫,在建立類例項的時候自動呼叫構造方法

(4)

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

建立Foo的物件時,會呼叫其構造方法,卻沒有傳進一個int型引數。如果類提供了一個自定義的構造方法,將導致系統不再提供預設構造方法。

 (5)

package text;

public class InitializeBlockDemo {

    /**
     * @param args
     */
    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{
    public int field=100;
    {
        field=200;
    }
    public InitializeBlockClass(int value){
        this.field=value;
    }
    public InitializeBlockClass(){
        
    }
}

結果是:200

           300

package text;

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();
        

    }
}

結果:

Root的靜態初始化塊
Mid的靜態初始化塊
Leaf的靜態初始化塊
Root的普通初始化塊
Root的無引數的構造器
Mid的普通初始化塊
Mid的無引數的構造器
Mid的帶引數構造器,其引數值:Java初始化順序演示
Leaf的普通初始化塊
執行Leaf的構造器

所以,我們由此可知:先執行靜態的初始化塊,並且只執行一次,之後才會執行構造方法,如果還有還有非靜態初始化塊,則會在構造方法之前執行