java課堂作業
課上問題
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指向的是同一個對象,而i2和j2則是分別指向不同的對象。
在通過valueOf方法創建Integer對象的時候,如果數值在[-128,127]之間,便返回指向IntegerCache.cache中已經存在的對象的引用;否則創建一個新的Integer對象。
上面的代碼中i1和i2的數值為100,因此會直接從cache中取已經存在的對象,所以i1和j1指向的是同一個對象,而i2和j2則是分別指向不同的對象。
11.使用類的靜態字段和構造函數,我們可以跟蹤某個類所創建對象的個數。請寫一個類,在任何時候都可以向它查詢“你已經創建了多少個對象?
//20163677 多文佳
public class duixiang {
public static int i=0;
{
i+=1; //用於創建對象個數的累加
}
public int chaxun() { //用於查詢當前創建對象的個數
return i;
}
java課堂作業