这两天正在看Thinking in Java,发现了很多以前没有注意的细节。恰巧看到一个关于变量初始化的问题。在这里小小分析下,以便自勉和自警。
这是一个关于Fibonacci问题的代码,错误的和正确的差别就在于变量result的初始化上。属性会被默认值初始化,局部变量如果不初始化,值不确定。Java和C++一样,允许变量先声明再赋值,所以这里的错误并不在
的认识。又如
其中s也没有初始化,但是在main方法这个大的范围内,s并没有被调用,它的赋值和调用过程都在for循环中,对于编辑器的反应就变成了
没有任何语法错误,编译完全正确。
总结,局部变量有别于属性,建议声明同时初始化,如未初始化,必须在该变量被调用语句所在范围内且在调用之前赋值!
//错误的
public class Test {
public static void main(String args[]) {
int m = 1,n = 1, result;
for(int i=3; i<=5; i++) {
result = n + m;
m = n;
n = result;
}
System.out.println(result);
}
}
//正确的
public class Test {
public static void main(String args[]) {
int m = 1,n = 1, result=1;
for(int i=3; i<=5; i++) {
result = n + m;
m = n;
n = result;
}
System.out.println(result);
}
}
这是一个关于Fibonacci问题的代码,错误的和正确的差别就在于变量result的初始化上。属性会被默认值初始化,局部变量如果不初始化,值不确定。Java和C++一样,允许变量先声明再赋值,所以这里的错误并不在
int m = 1,n = 1, result;
而在于
System.out.println(result);
调用了result这个只声明为被明确赋值的变量。有人会说,for循环中不是给予result赋值了吗?没错,for循环中是赋值了,但是编译器对于for循环只检查语法正确与否,循环中的内容肯本不会检查,编译器会有一个
int m = 1,n = 1, result;
for(int i=3; i<=5; i++) {
}
System.out.println(result);
的认识。又如
public class Test {
public static void main(String args[]) {
int s;
for(int i=1; i<=3; i++) {
s = i;
System.out.println(s);
}
}
}
其中s也没有初始化,但是在main方法这个大的范围内,s并没有被调用,它的赋值和调用过程都在for循环中,对于编辑器的反应就变成了
public class Test {
public static void main(String args[]) {
int s;
for(int i=1; i<=3; i++) {
}
}
}
没有任何语法错误,编译完全正确。
总结,局部变量有别于属性,建议声明同时初始化,如未初始化,必须在该变量被调用语句所在范围内且在调用之前赋值!