java是嚴格的面向對象的語言,因此裏面全部功能的實現都是以類和對象的形式來實現的,類是方法和數據的集合,對象是類的實現(即類描述的對象)。在使用類的方法時,須要定義一個該類的對象來使用其方法(靜態方法由於始終在內存內因此不須要定義對象來使用,但所以也不能類的非靜態成員)。java
在定義對象變量的過程當中,實際上分爲聲明類的引用類型的一個變量(一個引用)、將一個「new」後的對象賦值給該對象變量(分配內存)這兩個過程,因此顯而易見咱們經常使用的對象變量不是直接使用這個對象,因此會出現下面這種現象。ps:也由於這樣能夠將變量初始化爲null。函數
運行上面的代碼後發現這兩個對象不等,由於「==」判斷的是地址是否相同,new裏兩次就會有不一樣的地址。ps:若是變量是原始數據變量比較的就是數據大小。this
問題顯而易見,Foo類僅有個含有一個int參數,但在定義時是無參構造函數。spa
儘管有初始化塊,但卻在成員變量初始化的上方,因此在第一個問號處輸出結果爲100;code
因爲使用了帶有int參數的構造函數把300賦值給field,因此輸出結果爲300;對象
1.類的構造方法優先,若無對成員變量賦值的操做就看有沒有初始化塊和定義時指定的默認值;blog
2.初始化塊和定義時指定的默認值優先爲排在「下方」的爲最終結果;內存
3.都無,就爲null(儘可能不要產生這種結果)。字符串
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(); } }
結果:get
Root的靜態初始化塊
Mid的靜態初始化塊
Leaf的靜態初始化塊
Root的普通初始化塊
Root的無參數的構造器
Mid的普通初始化塊
Mid的無參數的構造器
Mid的帶參數構造器,其參數值:Java初始化順序演示
Leaf的普通初始化塊
執行Leaf的構造器
1.靜態優先,由於是編譯器在最開始就建立在內存中;
2.超類的初始化塊優先,很正常,由於定義子類的時候就得定義超類;
3.其次爲構造器,同上;
public class Test { public int a = 0; private int b = 1; static void test(Test a) { a.a = 2; a.setB(3); } public int getB() { return b; } public void setB(int b) { this.b = b; } public static void main(String[] args) { Test a=new Test(); System.out.println("a="+a.a); System.out.println("b="+a.getB()); Test.test(a); System.out.println("a="+a.a); System.out.println("b="+a.getB()); } }
只要加入個引用類型的參數就能實現對實例化的類的成員進行訪問。
很簡單,這是自動裝箱的規範要求。
規範要求boolean、byte、char小於等於127,介於-128~127之間的short和int被包裝到固定對象中,因此「==」纔會判等。
public class Test { static int number = 0; public Test() { number++; } public static void main(String[] args) { Test a; while (Test.number <= 5) { a = new Test(); } System.out.println(Test.number); } }