代码块中的局部变量与作用域

大多数过程型语言都有作用域(scope)的概念。作用域决定了在其内定义的变量名的可见性和生命周期。在C、C++和Java中,作用去由花括号的位置决定。例如:

{
    int x = 12;
    //only x available
    {
        int q = 36;
        //both x & q available
    }
    //only x available
    //q is "out of scope"
}

在定义域中定义的变量只可用于作用域结束之前。
考虑如下的一个问题:

public class CodeBlock {  
    public static void main(String args[]) {  
        {      
            int x = 30; 
        }  
        int x = 100;  
        System.out.println(x);  
    }  
}  

可以正常输出,但是如果我们交换顺序:

public class CodeBlock {  
    public static void main(String args[]) {    
        int x = 100;  
        {  
            int x = 30;  
        }  
        System.out.println(x);  
    }  
}  

就会报错。
实际上以上代码在C和C++中是合法的,但是在Java中却不可以这样写,编译器会报告变量x已经定义过。所以,在C和C++里将一个较大的作用域的变量“隐藏”起来的做法,在Java中是不允许的。因为Java设计者认为这样会导致程序混乱。
Java中:
第一种写法:先定义了代码块局部变量后定义方法局部变量,代码块局部变量x只能作用于定义它的代码块,也就是说出了代码块该x就被销毁了,所以后来再定义一个方法局部变量是可以的。
第二种写法:先定义了方法局部变量后定义了代码块局部变量,方法局部变量的作用域是整个方法,出了该方法后这个方法局部变量才被销毁,此例中,在方法局部变量还未被销毁时就定义了相同名字的代码块局部变量,所以被视为重复定义。

对象的作用域:

{
    String s = new String("a string");
}//end of scope

引用s在作用域的终点就消失了,然而,s指向的String对象仍继续占据内存空间。Java神奇之处在于有一个垃圾回收器,用来监视new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便提供其他对象使用。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值