变量(Variable)来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念,变量可以通过变量名进行访问。
变量名用于标记一段特定的存储空间,而变量值则以二进制形式保存在该空间中,且可以被访问和修改。注意,在强类型语言中,如 Java 中,变量必须先声明再使用,且必须指明其所属的数据类型。
Java 中的变量按照其所属的数据类型可以分为基本类型变量(由基本数据类型声明的变量)和引用类型变量(由对象类型声明的变量)。例如:
// 基本类型变量 private int age; // 引用类型变量 private Integer ageObj;
按照变量声明的位置可以分为成员变量和局部变量。
成员变量:成员变量在 Java 类中也称为属性(Attribute)、成员变量(Data Member)或域(Field)。
局部变量:在方法中或语句块中声明的变量被称为局部变量(Local Variable),局部变量只能在其所在的方法或语句块中起作用,因此也称为自动变量或临时变量,方法的形参也属于局部变量的一种。
例如:
public class Demo { // 成员变量 x private int x = 10; /** * add 方法指定了两个 int 类型的形参 * @param x 形参1 * @param y 形参2 * @return */ private int add(int x, int y) { // 局部变量 result int result = x + y; return result; } }
成员变量和局部变量的声明方式有所不同,成员变量声明格式如下:
[<修饰符>] <数据类型> <属性名>[=<缺省值>];
局部变量声明格式如下:
<数据类型> <变量名1>[=<缺省值1>][,<变量名2>[=<缺省值2>],...]
注意:上面格式中的 [] 是可选的,使用逗号分隔在一条语句中声明多个变量的方式并不提倡使用。
Java 变量不但要事先声明,还必须被初始化,即赋过值后才可以使用它的值。成员变量在其所属对象创建时就会被系统进行默认初始化。如果需要的话还可以借助显示初始化和构造方法再次对成员变量进行初始化处理。对于局部变量不会被系统默认进行初始化,需要手动进行初始化,使用时尤其需要注意。
实例:在 Demo 类中声明一个 int 类型的成员变量和一个 int 类型的局部变量,代码如下:
public class Demo { // 声明一个 int 类型的成员变量 x,并手动初始化为 10 private int x = 10; private int add(int x, int y) { // 声明一个 int 类型的局部变量 result int result = x + y; return result; } }
注意,在上面代码中使用显示初始化方式将成员变量 x 初始化为 10。
在上面已经介绍了,成员变量在所属类创建实例时,会被默认进行初始化。但是,局部变量不会被初始化,因此我们需要手动对局部变量进行初始化。如果我们使用未经初始化的变量,编译将出错。
例如:在 Demo 类中,成员变量 x 采用默认初始化,局部变量手动初始化为 0。代码如下:
public class Demo { // 声明一个 int 类型的成员变量 x,系统默认初始化 private int x; private int add(int x, int y) { // 声明一个 int 类型的局部变量 result,手动初始化 int result = 0; result = x + y; return result; } }
如果使用未初始化的变量,编译出错,如下:
private int add(int x, int y) { // 声明一个 int 类型的局部变量 result int result; result = result + x + y; return result; }
上面代码编译不会通过,这是因为 result 在没有初始化的前提下参与了计算。
变量的作用范围是指变量在多大的范围内才可以使用,出了这个范围变量将不可用。
成员变量的作用范围是其所属对象的作用范围,有时为了信息的封装需要,会限制变量的作用范围。例如,采用 public 修饰的成员变量,在任何其他类中均可以通过“对象名.成员属性”的方式进行访问。采用 private 修饰的成员变量,则只允许在其所在的类中能够访问,其他类需要通过提供的公共方法进行访问。
局部变量的作用范围是其所在的方法、代码块,出了该范围,局部变量不能被访问。
例如:下面代码中 factor 变量可以在 Demo 的任何位置进行访问(除了静态方法和静态块中),而 result 局部变量只能在 add() 方法中才能被访问,在 add() 方法外部不能被访问。代码如下:
public class Demo { // 声明一个 int 类型的成员变量 x private int factor = 5; private int add(int x, int y) { // 声明一个 int 类型的局部变量 result int result = (x + y) * this.factor; return result; } }