java中全部變量在使用以前必須獲得初始值,不然沒法編譯經過。java中的變量分爲類中的成員變量和方法中的局部變量,方法中的局部變量在使用以前咱們必須本身進行初始化。java
Java會在調用構造方法以前對全部沒有在聲明時賦值的成員變量賦予默認值。數組
在聲明成員變量的時候就指定初始化值。
在顯示指定初始化值時若用的其餘成員變量,必須保證用到的變量已經被初始化了。(成員變量的初始子上而下進行)this
靜態成員變量的初始賦值與普通成員同樣,惟一不一樣在於靜態變量初始化只在在類加載時執行一次,而普通成員變量在每次實例化時都執行一次。code
class Test { static int a = 1; static { System.out.println(a); } static int b = 2; }
靜態字句使用static後加大括號中,在類加載時靜態字句會被執行,且之只會在類加載時執行一次。
注意:初始時,先對a進行初始,而後執行靜態字句,而後對a進行初始化。若是上面輸出得是b那將編譯報錯,由於咱們不能再初始化直接使用一個變量。對象
class Test { int a = 1; { System.out.println(a) } }
非靜態字句在每次實例化時被執行。編譯器
每次建立類對象時都會調用類的構造方法,能夠在構造方法中進行一些初始化操做,不過構造方法的調用發生在成員初始化以後。編譯
能夠在構造方法將this做爲方法調用從而調用其它構造方法,但this調用只能調用一次且必須在第一行。class
public class Tree { private int h; public Tree() { this(6); } public Tree(int h) { this.h = h; } }
除構造方法中外,其餘任何地方都禁止調用構造方法。變量
類有父類時先對父類進行初始化,若是類類也有父類則對先初始化父類,以此進行下去。
而且在基類構造器第一個語句使用super調用父類的構造方法,若基類含有不帶參數的構造方法那麼能夠不顯示的調用super,編譯器會自動調用。
super只能在構造方法第一行調用一次。引用
public class A { public A(int a) { } } public class B { public B(int b) { spuer(b); } }
class Test { int[] as; public Test() { int[] bs; } }
Java中數組類型的變量也是對象,因此在成員變量的數組在聲明後若是未初始化則有默認值null,但bs因爲是方法裏聲明因此不會被自動初始化爲null,在使用以前就須要手動顯示的進行初始化。
class Test { public static void main(String[] args) { int[] aArr = new int[10]; Integer[] bArrs = new Integer[10]; } }
對於aArr賦予new對象引用,此時aArr指向的是10個值爲0的int數組。對於基本類型new的時候會爲數組的每個成員賦予默認值,若是是對象類型則賦予null: