十月21日作業 動手動腦
(1)
int value=100;
MyClass obj = new MyClass();
這兩種方式定義的變數是一樣的嗎?
不一樣,前者int是一種原始資料型別,直接進行定義和初始化就可以了。而後者是通過類名建立物件,再由物件建立物件變數,初始化需要依靠它本身的建構函式。
(2)
對於原始資料型別的變數(比如int),可以直接使用“==”判斷兩變數值是否相等;
物件變數也可以使用“==”判斷兩變數值是否相等嗎?
請輸入並執行以下程式碼,得到什麼結果??
package text; public class Text { public static voidmain(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的構造器
所以,我們由此可知:先執行靜態的初始化塊,並且只執行一次,之後才會執行構造方法,如果還有還有非靜態初始化塊,則會在構造方法之前執行