今天接着说Java成员变量。
前面说到了,根据变量的作用范围,Java中将变量分为了局部变量和成员变量。如果根据相对意义来说,局部变量相对于全局变量来说更容易理解,事实上,在Java中,成员变量也叫做全局变量,是从C++承袭而来的。
这种不在方法体也不在程序块中的变量,称为“成员变量”,它也称为“全局变量”。只要对象被引用,成员变量就将存在。
简单来理解,可以把类中的声明的属性,看做是类中的成员变量。如果从类的组成部分来看,成员变量就是类的属性;如果从变量的作用范围来看,类的属性就是成员变量。两者在实际应用上,是完全等价的。
看下面这个例子:
public class TestGlobalVar {
public static void main(String args[]) {
// 实例化GlobalVar后就可以访问具有访问权限的成员变量
GlobalVar gv = new GlobalVar();
System.out.println(gv.k);
}
}
class GlobalVar {
double k = 12.0;// 成员变量
public double methodB() {
return k;
}
}
在这个例子中,定义了一个类GlobalVar,在这个类里面定义了一个double类型的成员变量: k,在用于测试的类TestGlobalVar中,首先实例化这个类,然后再通过“实例名.变量名”的方式来访问它。
这个时候,k就是类GlobalVar的成员变量,也可以看做是类GlobalVar的属性了。
这里说说Java变量的的初始化。
这里先说说初始化操作:
在初始化变量时,应该把变量名写在左边,随后是赋值操作符“=”,然后再在右边加上一个恰当的Java表达式或值。
变量的初始化有两种方法:一种是在声明变量的时候就同时给它赋一个值:
int i = 4;
还有一种情况是,先声明变量,然后再在适当的时机给它赋值:
int k;
… …
k = 10;
前面说过了,Java中声明变量后,在使用变量之前,必须为变量进行初始化,即赋值操作。不能使用一个没有初始化过的、没有值的变量。
但我们一般只强调所有的局部变量在使用之前,都必须初始化(也就是说,必须要有值)。这里需要解释一下,成员变量在使用之前也是需要进行初始化的,不例外,但是Java对成员变量特殊的处理化方式,使得我们只需要关注局部变量的初始化工作,防止发生编译错误。
好了,我们现在就来看看,Java如何进行成员变量的初始化操作,导致Java局部变量与成员变量的初始化要求产生了如此不同。
其实也很好解释,就是如果你不给成员变量进行初始化操作的话,Java编译器就默默的为你做了这份工作了。。。。。。就和默认构造器是一个道理的。但是如果有必要的话,最好还是自己亲自动手为特定的成员变量进行初始化操作。毕竟它没有那么智能,只是机械进行默认的初始化操作——成员变量的默认初始化。
现在看看成员变量默认初始化的值:
类型 默认值 类型 默认值
byte 0 、short 0 、 int 0 、long 0L 、 float 0.0f 、double 0.0d 、char ‘\u0000’ 、boolean false 、object reference null
看下面这个例子:
public class GlobalVar {
int j;
public void b() {
System.out.println(j + 10);
}
public static void main(String[] agrs) {
GlobalVar t = new GlobalVar();
t.b();
}
}
在这个程序中,定义了一个成员的int类型的变量j,它没有被显式的初始化。在方法b()中,直接使用这个变量和一个整型数据相加,并将结果打印到控制台。
编译并执行这个程序将在控制台打印出一个数字10。这是因为虽然没有显式的初始化变量j,但是因为它是成员变量,系统自动给它赋了一个初值0,这样,打印出来的的结果是0+10等于10。
虽然成员变量可以不用显式初始化即可使用,但是,系统给不同数据类型的成员变量初始化时,它的初始化的值是不同的,比如,int类型的初始化值是0,boolean类型的初始化值是false。
下面列出了各种数据类型成员变量的默认初值:
int:0
byte: 0
double: 0.0
float:0.0
char:
long:0
short:0
boolean:false
Object:null
最后在强调一次,Java只针对成员变量进行默认初始化操作。