Java中的默认值和初始化

根据我的参考 ,原始types有默认值和对象为空。 我testing了一段代码。

public class Main { public static void main(String[] args) { int a; System.out.println(a); } } 

System.out.println(a); 将是一个错误指向variablesa ,说variable a might not have been initialized而在给定的参考, integer将有0作为默认值。 但是,下面给出的代码,它将实际打印0

 public class Main { static int a; public static void main(String[] args) { System.out.println(a); } } 

第一个代码可能会出现什么问题? 实例variables的行为不同于局部variables吗?

在第一个代码示例中, a是一个main方法局部variables。 方法局部variables需要在使用之前进行初始化。

在第二个代码示例中, a是类成员variables,因此它将被初始化为默认值。

仔细阅读您的参考资料 :

默认值

当声明一个字段时,并不总是需要赋值。 已声明但未初始化的字段将被编译器设置为合理的默认值。 一般来说,根据数据types,这个默认值将为零或为空。 然而依靠这样的默认值,通常被认为是糟糕的编程风格。

以下图表总结了上述数据types的默认值。

。 。 。

局部variables稍有不同; 编译器从不将一个默认值赋给一个未初始化的局部variables。 如果你不能初始化声明它的局部variables,在你尝试使用它之前,一定要给它赋值。 访问未初始化的局部variables将导致编译时错误。

这些是主要因素:

  1. 成员variables(默认是OK)
  2. 静态variables(默认OK)
  3. 最终成员variables(未初始化,必须在构造函数上设置)
  4. 最终静态variables(未初始化,必须设置在静态块{})
  5. 局部variables(未初始化)

注1:你必须在每个实现的构造函数上初始化最终的成员variables!

注2:你必须在构造函数本身的块内部初始化最后的成员variables,而不是调用另一个初始化它们的方法。 例如,这是无效的:

 private final int memberVar; public Foo() { //invalid initialization of a final member init(); } private void init() { memberVar = 10; } 

注3:数组是Java中的对象,即使它们存储了原语。

注意4:初始化一个数组时,它的所有项目都被设置为默认值,不pipe是成员还是本地数组。

我附上一个代码示例,介绍上述情况:

 public class Foo { //static and member variables are initialized to default values //primitives private int a; //default 0 private static int b; //default 0 //objects private Object c; //default NULL private static Object d; //default NULL //arrays (Note: they are objects too, even if they store primitives) private int[] e; //default NULL private static int[] f; //default NULL //what if declared as final? //primitives private final int g; //not initialized, MUST set in constructor private final static int h; //not initialized, MUST set in a static {} //objects private final Object i; //not initialized, MUST set in constructor private final static Object j; //not initialized, MUST set in a static {} //arrays private final int[] k; //not initialized, MUST set in constructor private final static int[] l; //not initialized, MUST set in a static {} //initialize final statics static { h = 5; j = new Object(); l = new int[5]; //elements of l are initialized to 0 } //initialize final member variables public Foo() { g = 10; i = new Object(); k = new int[10]; //elements of k are initialized to 0 } //A second example constructor //you have to initialize final member variables to every constructor! public Foo(boolean aBoolean) { g = 15; i = new Object(); k = new int[15]; //elements of k are initialized to 0 } public static void main(String[] args) { //local variables are not initialized int m; //not initialized Object n; //not initialized int[] o; //not initialized //we must initialize them before usage m = 20; n = new Object(); o = new int[20]; //elements of o are initialized to 0 } } 

是的,实例variables将被初始化为默认值,对于需要在使用前初始化的局部variables

 public class Main { int instaceVariable; // Instance variable will be initalized to default value public static void main(String[] args) { int localVariable = 0; // Local Variable Need to initalize before use } } 

局部variables不会得到默认值。 他们的初始值是未定义的,通过某种方式分配值。 在你可以使用局部variables之前,它们必须被初始化。

当你在类层次(作为一个成员,即作为一个字段)和方法级别声明一个variables时,会有很大的不同。

如果您在课程级别声明了一个字段,则会根据其types获取默认值。 如果在方法级别或块中声明一个variables(意味着{}中的任何代码)不会获取任何值,并且保持未定义状态,直到某种方式获得一些起始值,即分配给它们的一些值。

在声明原始types值的时候要记住一些事情。

他们是:

  1. 在方法中声明的值不会被分配一个默认值。
  2. 声明为实例化variables或静态variables的值的默认值为0。

所以在你的代码中:

 public class Main { int instanceVariable; static int staticVariable; public static void main(String[] args) { Main mainInstance = new Main() int localVariable; int localVariableTwo = 2; System.out.println(mainInstance.instanceVariable); System.out.println(staticVariable); // System.out.println(localVariable); //will throw compilation error System.out.println(localVariableTwo); } } 

所有的成员variables都必须加载到堆中,以便在创build类的实例时使用默认值进行初始化。 在局部variables的情况下,它们不会被加载到堆中,直到它们在java 7之前被使用,所以我们需要明确地初始化它们。

在java中,默认的初始化只适用于类成员的实例variables,它不适用于局部variables。