1. 程式人生 > >java課堂作業

java課堂作業

ron bsp src str image justify 包裝 宋體 內容

課上問題

1.早期我們經常這樣定義變量

int value=100;

前面的示例中這樣定義變量

MyClass obj = new MyClass();

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

答:不一樣,前面是定義定義原始數據類型的變量,而後邊是定義一個對象變量。

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

不可以。因為對象變量使用==”判斷的是地址是否相等。

3.請輸入並運行以下代碼,得到什麽結果?

public class Test{

public static void main(String args[]){

Foo obj1=new Foo();

Foo obj2=new Foo();

System.out.println(obj1==obj2);

}

}

class Foo{

int value=100;

}

4.

技術分享

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

答:函數名與類名相同,沒有返回值。

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

技術分享

答:Foo類的構造函數有參數,而主函數中定義對象時沒加變量。

6.如果一個類中既有初始化塊,又有構造方法,同時還設定了字段的初始值,誰說了算?

答:他們都是用於初始化,三者的執行次序為初始化塊,初始值,構造方法,所以最後的構造方法說了算。

7.以下代碼輸出結果是什麽?

技術分享

技術分享

答:輸出結果為

技術分享

8.請依據代碼的輸出結果,自行總結Java字段初始化的規律。

答:java字段初始化時當類中存在初始化塊,初始值,構造方法時,當無參數創建一個對象時,會進行初始化塊和初始值的步驟,並調用無參數的構造函數,當進行添加參數時他會再調用構造函數。所以第一次的值是100,第二次是300

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

技術分享

總結:對象的初始化順序:首先執行父類靜態的內容,父類靜態的內容執行完畢後,接著去執行子類的靜態的內容,當子類的靜態內容執行完畢之後,再去看父類有沒有非靜態代碼塊,如果有就執行父類的非靜態代碼塊,父類的非靜態代碼塊執行完畢,接著執行父類的構造方法;父類的構造方法執行完畢之後,它接著去看子類有沒有非靜態代碼塊,如果有就執行子類的非靜態代碼塊。子類的非靜態代碼塊執行完畢再去執行子類的構造方法。總之一句話,靜態代碼塊內容先執行,接著執行父類非靜態代碼塊和構造方法,然後執行子類非靜態代碼塊和構造方法。

10.

技術分享

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

答:integer不是一個基本類型,而是int的一個包裝類,所以上式表明i1和j1指向的是同一個對象,而i2j2則是分別指向不同的對象。

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

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

11.使用類的靜態字段和構造函數,我們可以跟蹤某個類所創建對象的個數。請寫一個類,在任何時候都可以向它查詢“你已經創建了多少個對象?

//20163677 多文佳

public class duixiang {

public static int i=0;

{

i+=1; //用於創建對象個數的累加

}

public int chaxun() { //用於查詢當前創建對象的個數

return i;

}

java課堂作業