3.5 变量及其初始化
在编写程序时,通常需要使用一个“别名”来表示某种类型的可变值,这就是“变量”。在前面的程序中已经在很多地方用到了“变量”。比如,任务四中,就定义了变量“address”、“title”等。
3.5.1 知识准备:局部变量
大多数过程语言都有作用域的概念,作用域决定了在其内的变量名的可见性和生命周期。Java 允许变量在任何程序块内被声明。变量的作用域在指定的局部程序块(可以是方法体、程序段等),这种类型的变量通常被称为“局部变量”。要注意的是,变量在其作用域内被创建,离开其作用域时被撤销。因此,一个变量的生存期就被限定在它的作用域中,超出了作用域局部变量无效。
1.在程序块中声明局部变量
所谓程序块,就是用“{”和“}”包含起来的代码块。它是一个单独的模块,和方法有点类似,但不能像方法一样可以用方法名来调用。在这个程序块中的变量也是局部变量,即使这个程序体处于类的定义中。如下程序段:
public class Clock{ int getUp = 6; { int goBed = 11; } public void printit() { System.out.println(getUp); System.out.println(goBed);// 出错,因为goBed是局部变量,不能用于变量所在程序块范围之外 } }
其中的变量gobed就是局部变量,它只在自己所处的代码块中起作用。
在Java中,所有的变量必须先声明再使用。基本的变量声明方法如下:
<data_type> var_name [=var_value]
其中data_type是变量类型,它可以是基本类型之一,或类及接口类型的名字。变量类型后面,跟着此变量的名称,它的名称必须是一个符合Java命名规范的标识符。然后,可以给这个变量赋一个值,注意,这个值的数据类型必须和变量的数据类型一致(或者兼容)。下面是变量声明的几个例子:
int i; double d1 = 123.4; double d2 = 123;
声明同一类型的多个变量时,使用逗号将各变量分隔开:
int i,j,k; int a=1,b,c=100;
2.在方法体中声明局部变量
此时,此变量的作用范围只局限于此方法体内。示例如下:
public class ClockTest{ static int getUp = 6; { int goBed = 11; } public void alarm() { int al = 20; } public void close() { System.out.println(al);// 出错,al的作用范围只局限于方法alarm中 } }
因为变量al是定义在方法alarm中的,所以它的作用范围只局限在方法alarm中。在方法close中试图使用这个变量,在编译的时候将会报错。
局部变量在方法或代码块执行时创建,方法或代码块执行结束时销毁。局部变量在使用前必须初始化。
3.5.2 知识准备:成员变量
不在方法体也不在程序块中的变量,称为成员变量。成员变量定义在类中,是类成员的一部分,整个类都可以访问它。只要类的对象被引用,成员变量就将存在。Java中成员变量说明的形式如下:
[修饰符] 成员变量类型 成员变量名列表;
成员变量的修饰符有以下几种:默认访问修饰符、public、protected、private、final和static 等。默认访问修饰符的成员变量可以被同一包(Package)中的任何类访问。
下面是成员变量的一个例子:
源文件:Contact.java
public class Contact{ public static void main(String args[]) { // 实例化SendMsg后可以访问具有访问权限的成员变量 SendMsg send = new SendMsg(); System.out.println(send.word); } } class SendMsg { int word = 12;// 成员变量 public int getWord() { return word; } }
在这个例子中,定义了一个类SendMsg,在这个类里面定义了一个int类型的成员变量:word,在用于测试的类 Contact中,首先实例化这个类,然后再通过“实例名、变量名”的方式来访问它。
3.5.3 知识准备:变量初始化
所有的局部变量在使用之前,都必须初始化,也就是说,必须要有值。
在初始化变量时,应该把变量名写在左边,随后是赋值操作符“=”,然后再在右边加上一个恰当的Java表达式或值。
变量的初始化有两种方法:一种是在声明变量的时候同时给它赋一个值:
int i = 4;
还有一种是,先声明变量,然后再在适当的时机给它赋值:
int k; … k = 10;
3.5.4 知识准备:局部变量的初始化
局部变量也可以像成员变量一样,先声明,再初始化;或者在声明的同时,就对其进行初始化。也可以一次声明几个同一数据类型的变量。但是,系统不会对局部变量进行默认的初始化,因此,局部变量在使用之前,必须对其进行显式初始化。
下面的代码中,因为n没有初始化,所以,这个时候如果对它进行操作,将会报错:
public class Test{ … public void aMethod(int j){ int m,n,k; m = j; k = 100; System.out.println(m); System.out.println(n);//Error System.out.println(k); } }
注意,在这个程序中的变量 m,它根据方法的传入参数 j来初始化,所以这个时候在方法体中是可以对其进行任何和其数据类型相匹配的操作了。
3.5.5 知识准备:成员变量的初始化
变量在使用之前,必须首先对它进行初始化。首先来看一下成员变量的几种初始化方式:
□ 成员变量的初始化可以在声明时初始化,那么创建一个新对象时,此成员变量的值固定不变。
□ 成员变量在类的构造方法或其他方法中动态的初始化。
□ 成员变量的默认初始化值。
默认初始化是Java成员变量的特性,可以不需要手动地显式初始化成员变量。因为系统在创建一个新的对象的时候,会给这些成员变量赋一个初值。在这里需要注意的是,对于引用变量,它的默认初值是null而非相应的引用类型对象,也就是说,它并不指向任何对象的首地址。特别是不能通过该引用类型变量去调用任何方法或属性,否则,将会出现错误。
虽然成员变量可以不用显式初始化即可使用,但是,系统给不同数据类型的成员变量初始化时,它的初始化的值是不同的,比如,int类型的初始化值是0,boolean类型的初始化值是false。这与3.4节中给出的基本类型默认初始值相同。
注意:
系统只对全局(成员)变量指定默认的值,不会对局部变量赋值。
3.5.6 任务五:成员变量的3种初始化方式
1.任务描述
编写一个类,有3个成员变量,分别用上述3种方式进行初始化,打印它们的值,查看初始化效果,并验证Java实行了成员变量的默认初始化。
2.技能要点
□ 掌握3种初始化方式。
□ 了解3种初始化方式的区别和应用场合。
3.任务实现过程
(1)编写一个名为Initialize的类,该类中声明3个int类型变量:a、b、c。对a进行声明时的初始化,确定a的值;对b在构造方法中进行动态初始化;对c不进行初始化。
(2)在main()方法声明并初始化一个Initialize对象,打印其成员变量a、b、c的值。
源文件:Initialize.java
public class Initialize { int a = 10;//成员变量a在声明时初始化 int b; int c; public Initialize(int i){ this.b = i;//构造方法中初始化成员变量b } public static void main(String[] args) { Initialize init = new Initialize(20); System.out.println("声明时初始化变量a="+init.a+ "\n构造方法初始化变量b="+init.b+"\n变量默认初始化c="+init.c); } }
(3)运行程序,输出结果如下:
声明时初始化变量a=10 构造方法初始化变量b=20 变量默认初始化c=0