4.4.3 变量的初始化
Java语言要求变量遵循先定义,再初始化,然后使用的规则。变量初始化是指变量定义以后,首次给它赋初始值的过程。
成员变量(类变量和实例变量)的初始化:无论是实例变量还是类变量,在建立时,系统首先赋一个默认的初始值。初始化为默认值的规则为:
(1)整数型(byte、short、int和long)基本类型变量的默认值为0;
(2)单精度浮点型(float)基本类型变量的默认值为0.0f;
(3)双精度浮点型(double)基本类型变量的默认值为0.0d;
(4)字符型(char)基本类型变量的默认值为“\u0000”,即空字符;
(5)布尔型(boolean)基本类型变量的默认值为false;
(6)引用型变量的默认值为null;
(7)数组引用类型变量的默认值为null。
如果一个变量在定义时包含有初始化表达式,那么系统会随后计算该表达式并给变量重新赋值。这种情况也被称为显式初始化变量。
【例4-8】 定义职员类,包含公司名称、职员姓名、姓名、年龄、性别、婚否及工资等变量。打印变量的初始值。
程序运行结果:
局部变量的初始化:局部变量声明后,系统不会赋一个默认的初始值。因此,局部变量必须显式初始化后,才能使用它。如果局部变量使用前没有显式初始化,编译器将报错。
【例4-9】 局部变量的错误引用。
分析与思考:编译时出现错误,解决办法为局部变量在引用前赋值。int i;改为int i=3;或在System.out.println(″i=″+i);前加赋值语句i=3;。
对于成员变量(类变量和实例变量),Java语言提供了多种初始化途径。既可在声明时初始化,也可以在动态初始化块中或构造方法中初始化(适用于实例变量),还可在静态初始化块中初始化(适用于类变量)。这样,类的结构为:
注意:根据类的结构,成员变量只能在成员变量中、成员方法中、构造方法中、静态初始化块中或动态初始化块中引用,否则,编译器会报错。
【例4-10】 成员变量的错误引用。将例4-7的Circle类改写如下。
分析与思考:编译时出现错误,解决办法为total=0;和radius=10;放在printVar()方法中。
构造方法将在后面详细讨论。
类变量的初始化也可以通过静态初始化块来进行。静态初始化块是一个块语句,代码放置在一对大括号内,大括号前用关键字static修饰:
一个类中可以定义一个或多个静态初始化块。静态初始化块在类装入时自动执行一次。静态初始化块内的代码和类变量定义语句中的初始化表达式按照它们在类定义正文中出现的先后次序依次计算和执行。
静态初始化块不是方法,它的作用只是用来初始化类变量。静态初始化块内不能出现break语句、continue语句、return语句、try-catch-finally语句、throw语句,也不能以任何方式引用this和super,否则将导致编译错误。
实例变量的初始化也可以通过动态初始化块来进行。动态初始化块是一个块语句,代码放置在一对大括号内,大括号前没有修饰符:
一个类中可以定义一个或多个动态初始化块。动态初始化块在创建对象时自动执行一次。动态初始化块内的代码和实例变量定义语句中的初始化表达式按照它们在类定义正文中出现的先后次序依次计算和执行。
动态初始化块不是方法,它的作用只是用来初始化实例变量。动态初始化块内不能出现break语句、continue语句、return语句、try-catch-finally语句、throw语句,否则将导致编译错误。
【例4-11】 定义职员类,包含公司名称、职员姓名、年龄、性别、婚否及工资等变量。使用静态初始化块和动态初始化块初始化变量,并打印变量的初始值。
程序运行结果:
小结
·局部变量在方法每次调用时重新初始化,与上次调用无关。
·局部变量在使用前,一定要显式初始化或赋值。
·实例变量的初始化发生在对象产生时。
·实例变量有默认值。可以通过构造方法进行初始化或动态初始化块进行初始化。·类变量的初始化发生在类装入时。
·类变量有默认值。可以通过静态初始化块进行初始化。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。