Java 语言要求变量遵循先定义,再初始化,然后使用的规则。
变量的初始化是自从变量定义以后,首次给它赋初值的过程。
对于类的成员变量。不管程序有没有显示的初始化,Java 虚拟机都会先自动给它初始化为默认值。
规则为:
1、整数类型(byte、short、int、long)的基本类型变量的默认值为0。
2、单精度浮点型(float)的基本类型变量的默认值为0.0f。
3、双精度浮点型(double)的基本类型变量的默认值为0.0d。
4、字符型(char)的基本类型变量的默认为 “/u0000”。
5、布尔性的基本类型变量的默认值为 false。
6、引用类型的变量是默认值为 null。
7、数组引用类型的变量的默认值为 null。春关键数组变量的实例后,如果没有没有显示的为每个元素赋值,Java 就会把该数组的所有元素初始化为其相应类型的默认值。
局部变量初始化
局部变量声明以后,Java 虚拟机不会自动的为它初始化为默认值。因此对于局部变量,必须先经过显示的初始化,才能使用它。
如果编译器确认一个局部变量在使用之前可能没有被初始化,编译器将报错。
public void method(){
int a;
a++;//编译出错,变量a 必须初始化
System.out.println(a);
}
public void method2(){
int x = (int)(Math.random() * 100);
int y;
int z;
if(x > 50){
y = 9;
}
z = y + x;//编译出错,变量y可能没有被初始化
}
如果局部变量没有被初始化,并且在方法中一直没有被使用,则编译和运行都会通过。
为什么 Java 虚拟机会自动初始化类的成员变量,却要求局部变量必须显示的初始化?
1、对于局部变量,很有可能是程序员疏忽,忘记了初始化局部变量,Java 编译器在编译阶段强制要求程序员给局部变量赋初始值,可避免潜在的威胁。
2、对于成员变量,Java 语言提供了多种的初始化的途径。可以在声明时显示初始化,也可以在构造方法中初始化(适用于实例变量),还可以在静态代码块中初始化(适用于静态变量)。假如程序员没有显示的初始化成员变量,Java 语言则认为这些变量的初始值刚好和该数据类型的默认值相同,因此提供自动初始化的功能,以此简化编程。