static int x;
public static void main(String[] args) {
int x ; int j = x;
}
}
会产生如下的编译错误:
Variable 'x' may be used before initialization
(变量尚未初始化就被使用)
在Java中,变量在使用之前必须要先赋初值。可以在变量定义的时候赋给它初始值。例如:
int foo = 3;
double dn = 3.1415926D
也可以在变量定义之后再对它赋值。例如: int value; …… value = 1;
3局部变量的作用域
作用域,是指一个标识符在程序中的有效范围。这里,我们只讲局部变量的作用域,即在块中定义的变量的作用域。块(block)是指用一对大括号{}括起来的一系列语句和变量声明。比如,每个方法体都是一个块,在方法体内,也可以用{}定义块。块可以嵌套。程序清单4-6说明了块的概念。
注意:这里所说的块仅指方法体和方法体中嵌套的块,不包括类体。
程序清单4-6 class Block { public static void main(String[] args) { int a = 3; System.out.println(a+”在方法体中”); { //此处定义了一个子块 int b = 4; System.out.println(b+ “在第一层子块中”); { //子块中又定义子块 int c = 5; System.out.println(c+ “在第二层子块中”); } } } } 程序清单4-6执行结果如下:
3在方法体中 4在第一层子块中 5在第二层子块中
块在执行时按照从前到后,从左到右的顺序依次执行。如果块中的所有语句都能正确执行,则块可以正确执行,否则,如果块中的某一条语句执行异常,那么整个块也会因同样的原因执行失败。
局部变量是在块中定义的。局部变量的作用域是从它定义之处起到它所在的块结束之处,包括它的初始化部分。如果在这个范围内重新定义了该变量(即定义了和该变量重名的变量),就会产生编译错误。也就是说,局部变量的隐藏是不允许的。程序清单4-7是一个错误的例子,它试图隐藏局部变量,结果会产生编译错误。
程序清单4-7 class Scope { public static void main(String[] args) { int a = 3; //在方法体中定义了局部变量a System.out.println(a); { int a = 8; //错误!此处不能再定义同名的局部变量 System.out.println(a); } System.out.println(a); } } 编译程序清单4-7时,编译器会产生如下错误:
Variable 'a' is already defined in this method Error executing jvc.exe.
错误信息表明变量a在main方法中已经定义了,在内层块中不能重新定义以隐藏外层定义的变量a。
但是,在两个不存在包含关系的块中定义相同名字的变量是允许的,因为它们的作用域不相交。程序清单4-8示例了两个没有嵌套关系的块中变量的作用域。
程序清单4-8 class Scope2 { public static void main(String[] args) { { //第一个子块 int a = 3; //在第一个子块中定义局部变量a System.out.println(“在第一个块中的变量a= “+a); } //第一个块中定义的局部变量a的作用域到此结束 { //第二个子块 int a = 8; //在第二个子块中定义局部变量a System.out.println(“在第二个块中的变量a= “ + a); } //第二个块中定义的局部变量a的作用域到此结束 } } 程序4-8的输出结果如下:
在第一个块中的变量a= 3 在第二个块中的变量a= 8