在java中变量是具有默认初始化值的。
但这这么说也不怎么准确,因为java中的变量(我觉得称为字段更合适),分为属于类的成员变量和属于函数或者局部代码块的局部变量。如果在定义变量后没有给它们赋初始值,那么java会给于一个默认的初始化值,但只有类的成员变量才被初始化,而局部变量不会被初始化。如果没有被初始化的变量被操作,java在编译器就会给予错误警告,如果没有被赋予初值的局部变量,一直没被操作,则编译通过,java不会给予错误警告。
除了变量的初始化外,新创建的类的引用也是一样,如果没有用new关键字给它分配对象的话,如果这个引用是属于类的成员字段则被默认初始化为null,如果在函数或者局部代码块内部,不会被初始化;
基本类型 | 默认值 |
char | '\u0000'(null) |
byte | 0(byte 1字节) |
short | 0(short 2字节) |
int | 0(4字节) |
long | 0L |
float | 0.0f |
double | o.od |
boolean | false |
另外添加一个:类引用会被初始化为null
下面,用一段代码测试一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
/************************************************************************* * @File Name: initDemo.java * @Author: kehr * @Mail: kehr163@163.com * @Created Time: 2013年12月17日 星期二 19时26分31秒 * @Copyright: GPL 2.0 applies * @Description: *************************************************************************/ class Demo{ } class InitDemo { //这里定义的是基本数据类型 byte bA; short sA; int iA; long lA; char cA; float fA; double dA; boolean boolA; //这里定义了一个类的引用 Demo demo1; void show(){ //在函数中定义基本数据类型(不会被初始化,值是任意 //的。如果没有初始化的变量被使用,java在编译期间就 //会检查到,并且给予错误提示) byte bB; short sB; int iB; long lB; char cB; float fB; double dB; boolean boolB; //在函数内定义一个类的引用。 Demo demo2; System.out.println( "bA:" +bA); System.out.println( "sA:" +sA); System.out.println( "iA:" +iA); System.out.println( "lA:" +lA); System.out.println( "cA:" +cA); System.out.println( "fA:" +fA); System.out.println( "dA:" +dA); System.out.println( "boolA:" +boolA); System.out.println( "demo1:" +demo1); System.out.println( "----------------------" ); // System.out.println("bB:"+bB); // System.out.println("sB:"+sB); // System.out.println("iB:"+iB); // System.out.println("lB:"+lB); // System.out.println("cB:"+cB); // System.out.println("fB:"+fB); // System.out.println("dB:"+dB); // System.out.println("boolB:"+boolB); // System.out.println("demo1:"+demo1); } public static void main(String[] argv) { InitDemo t = new InitDemo(); t.show(); } } |
运行结果:
这个结果就说明了,类测成员变量会被给予一个默认初始化值,类引用也会被初始化位null<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+z8LD5rXEveG5+8rHyKW19MnPzsS0+sLr1tDK5LP2uq/K/bPJ1LGx5MG/JiMyMDU0MDu1xNPvvuSjrMbky/zDu9PQ1/a4xLavPC9wPgo8cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20131218/20131218093053283.jpg" alt="">
从上面的报错信息我们不难看出,包含在函数中的成员变量或者类引用,都不会被默认给予初始化值。
思考:
java的这种机制避免了没有被初始化的数据成员在进行其它操作时引起的严重性错误,尽量从语法上避免程序员犯错。与之相反,C和C++,无论你对变量时候进行初始化,都可以对变量进行操作,这时变量中存储的是一串随机的数字(可能是上一个程序使用该内存空间后遗留的值,计算机中的数据不会被物理意义上的“擦除”,你对一块内存的写数据只是覆盖了这块内存的旧值而已。)。java编译器会将未初始化变量视为错误,而C/C++编译器则将其视为警告
转载请注明:学时网 » JAVA成员变量初始化和局部变量初始化