1、若是一個類中既有初始化塊,又有構造方法,同時還設定了字段的初始值,誰說了算?ide
1 public class InitializeBlockDemo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 InitializeBlockClass obj=new InitializeBlockClass(); 9 System.out.println(obj.field); 10 11 obj=new InitializeBlockClass(300); 12 System.out.println(obj.field); 13 } 14 15 } 16 17 class InitializeBlockClass{ 18 //下面這句在初始化塊以前與以後,會影響到field字段的初始值 19 //public int field=100; 20 21 { 22 field=200; 23 } 24 public int field=100; 25 public InitializeBlockClass(int value){ 26 this.field=value; 27 } 28 public InitializeBlockClass(){ 29 30 } 31 }
運行結果:函數
若field定義在代碼塊以前: this
若在代碼塊後面:spa
能夠得出結果:構造函數的優先級最高,最後必定執行構造函數。設定了字段的初始值與代碼塊的優先級相同,在沒有構造函數的狀況下,按照順序依次執行,獲得後面的結果。3d
2、靜態方法中只容許訪問靜態數據,那麼,如何在靜態方法中訪問類的實例成員?code
package TestDemo; public class E { int x=3; public static void f(){ E a=new E(); System.out.println(a.x); } public static void main(String[] args) { E x=new E(); x.f(); } }
能夠經過在靜態方法中將一個對象的引用傳入到靜態方法中,即可以調用該對象的非靜態方法。對象
3、使用類的靜態字段和構造函數,能夠跟蹤某個類所建立對象的個數。請寫一個類,在任什麼時候候均可以向它查詢「你已經建立了多少個對象?」。blog
1 package TestDemo; 2 3 public class E { 4 static int x=0; 5 E(){ 6 x++; 7 } 8 9 void f() { 10 System.out.println("你共建立了"+x+"個"); 11 } 12 public static void main(String[] args) { 13 E a=new E(); 14 a.f(); 15 E b=new E(); 16 E c=new E(); 17 E d=new E(); 18 d.f(); 19 } 20 }
運行結果:it
4、 對象判等:編譯
運行結果爲false
當「==」施加於原始數據類型變量時,是比較變量所保存的數據是否相等 當「==」施加於引用類型變量時,是比較這兩個變量是否引用同一對象。
兩個對象的「內容」,實際上是指它們在某一時刻的全部字段的值,「內容相等」,實際上是就「對應字段值」一致。 在Java中要比對兩個對象的字段值,能夠 「重寫(override)」基類的equals()方法。
5、裝箱與拆箱問題:
public static void main(String[] args) { int value=100; Integer obj=value; //裝箱 int result=obj*2; //拆箱 }
簡單一點說,裝箱就是自動將基本數據類型轉換爲包裝器類型;拆箱就是自動將包裝器類型轉換爲基本數據類型。
反編譯結果:
能夠看到分別調用了 Integer.valueOf();和 Integer.intValue();方法
看以下代碼:
兩對整數明明徹底同樣,爲什麼一個輸出true,一個輸出false?
解答:
反編譯
方法 Integer.valueOf();源代碼:
public static Integer valueOf(int i) { return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128]; }
能夠看到,當i不符合範圍時爲建立一個Integer的對象,故不相等。