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将导致编译时错误。
这些是主要因素:
- 成员variables(默认是OK)
- 静态variables(默认OK)
- 最终成员variables(未初始化,必须在构造函数上设置)
- 最终静态variables(未初始化,必须设置在静态块{})
- 局部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值的时候要记住一些事情。
他们是:
- 在方法中声明的值不会被分配一个默认值。
- 声明为实例化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。