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: