变量初始化

这两天正在看Thinking in Java,发现了很多以前没有注意的细节。恰巧看到一个关于变量初始化的问题。在这里小小分析下,以便自勉和自警。

//错误的
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++) {

}
}
}

没有任何语法错误,编译完全正确。

总结,局部变量有别于属性,建议声明同时初始化,如未初始化,必须在该变量被调用语句所在范围内且在调用之前赋值!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值