为什么局部变量需要显式赋值,而成员变量可以不需要显式赋值

在网上搜的结果都是相同的一句话,配一段毫无关系的代码,说明不了问题。
这里先给出原因:成员变量其赋值和取值的顺序具有不确定性,可以在方法调用(取值)前赋值,也可以在方法调用(取值)后赋值,其具体顺序是在运行时发生的,编译器确定不了。而局部变量,赋值、取值顺序确定。所以局部变量赋值使用,是一种设计约束,可以减少犯错的可能性。

一个可以准确说明问题的例子:

	public class InstanceInitializer {  
    private int j = getI();  
    private int i = 1;  

    public InstanceInitializer() {  
        i = 2;  
    }  

    private int getI() {  
        return i;  
    }  

    public static void main(String[] args) {  
        InstanceInitializer ii = new InstanceInitializer();  
        System.out.println(ii.j);  
        System.out.println(ii.getI());  
    }  
}  

说明:这个例子引自其他文章,我在此之上稍作改动使得其更能说明问题。
输出的结果是:

0
2

从第一行输出结果可以看出实例化时先执行了getI()函数,此时i还没有对i进行初始化赋值。所以得到默认值0(实例化对象分配内存时赋的默认值。显式赋值privatr int i = 1;此时没有执行)。这里充分体现了上面原因中所说的"成员变量可以在方法调用后赋值",如果没有默认赋值,则此时函数返回值无法确定。所以强制要求成员变量赋初值没有什么太大意义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值