变量的做用域和生命周期java
到目前为止,使用的全部变量都是在main()方法开始时声明的,然而,Java容许在任何代码块(代码块以开花括号开始,以闭花括号结束)中声明变量,代码块定义了做用域。所以,每当开始一个新的代码块时就建立了一个新的做用域。做用域决定了变量(对象)对程序的其它部分的可见性,而且也决定了这些变量(对象)的生命周期。学习
许多其余的计算机语言定义了两种通用的做用域类别,全局做用域和局部做用域。然而这些传统的做用域不能很好地适应Java中严格的、面向对象的模型。虽然能够建立属于全局做用域的变量,但这只是例外,而不是规则。在Java中,两种主要的做用域分别由类和方法定义的。尽管这种分类有些人为的因素,可是,因为类做用域具备的一些独特属性和特征,不能应用于由方法定义的做用域,所以这种分类方法是有必定的道理的。因为存在这种差异,对类做用域的介绍已经超出了本书的内容范围,因此本书将只分析由方法定义及在方法中定义的做用域。对象
由方法定义的做用域从方法的开花括号开始。然而,若是方法具备参数,那么它们也会被包含到方法的做用域中。做为通用规则,在做用域中声明的变量,对于在做用域以外定义的代码是不可见的(即不可以使用)。所以,当在某个做用域中声明变量时,就局部化对象了该变量,并保护它免受未受权的使用或修改。实际上,做用域规则为封装(将在学习面向阶段时学习封装,封装是面向对象的三大特征之一,面向对象的三大特征分别是:封装、继承和多态)提供了基础。blog
做用域是能够嵌套的。例如,每当建立一个代码块时,就建立了一个新的、嵌套的做用域。当遇到这种状况时,外层的做用域包围了内层的做用域。这意味着在外层做用域中声明的变量对内层做用域中的代码是可见的。然而,反过来就不是这样了,在内层做用域中声明的变量,在内层做用域以外是不可见的。继承
在代码块中,能够在任意位置声明变量,可是只有在声明以后变量才是有效的。所以,若是在方法的开头定义变量,那么变量对于该方法的全部代码都是可见的,相反,若是在代码块的末尾声明变量,那么变量是无用的,由于没有代码可以访问该变量。生命周期
当进入变量的做用域时建立变量,当离开它们的做用域时销毁变量。这意味着一旦离开做用域,变量就不会保持原来的值。因此,对于在方法中声明的变量来讲,在两次调用该方法之间,变量不会保持它们的值。此外,对于在代码块中声明的变量来讲,当离开代码块时会丢失它们的值。所以,变量的生命周期被限制在做用域以内。作用域
若是变量声明中包含初始化,那么每当进入声明变量的代码块时都会从新初始化变量。字符串
变量的使用编译
使用变量的方式有不少,使用System.out.println()在控制台输出变量值是使用变量的一种方式,也可使用运算符完成变量之间的运算。新建Java源代码文件Example01.java,编写以下代码:class
public class Example01{
/**
* main方法,程序执行的入口
*/
public static void main(String[] args){
int price = 10;
int count = 5;
System.out.println("商品总价:" + price * count);
}
}
上面的案例在运算中,使用“*”完成了变量之间乘法运算,使用“+”完成了字符串与数字的拼接,最终输入结果如图2所示:
图2 Example01运行结果
须要注意的是仅仅声明但没有初始化的变量是不容许使用的,例如如下代码:
public class Example01{
/**
* main方法,程序执行的入口
*/
public static void main(String[] args){
int price = 10;
int count = 5;
System.out.println("商品总价:" + price * count);
int num; //声明一个变量可是没有进行初始化
System.out.println(num); //使用一个未初始化的变量,在编译阶段将 //提示错误信息
}
}
编译以上代码,控制台将提示如图3所示的错误。
图3 编译错误