在Java中有些变量使用的时候不需要人为的初始化,系统会自动给变量赋默认的值
例如:
boolean 变量的初始值如果有的话,则为false。
int 变量的初始值如果有的话,则为0.
那么什么情况下,java中的变量会自动初始化呢?这里我们主要讨论以下几种情况:实例变量、类变量、函数中的局部变量
1)实例变量
实例变量都会在构造函数中进行自动初始化,会有相应的值。
class T1{
private int t1;
private double t2;
private boolean t3;
void test(){
System.out.println(t1+" "+t2+" "+t3);
}
}
这里的输出结果:0 0.0 false
但是如果类的实例有final修饰符的时候,需要特别注意了,含有final修饰符的实例变量必须要由程序员指定初始值,指定方式有两种:
a. 在final 实例变量定义的时候进行初始化,例如
class T1{
final private int t1=10;
void test(){
System.out.println(t1+" ");
}
}
b.在非静态块中进行进行初始化,例如
class T1{
final private int t1;
void test(){
System.out.println(t1+" ");
}
{ //去掉括号会报错的
t1=10;
}
}
c.在构造函数中进行初始化,例如
class T1{
final private int t1;
T1(){
t1=10;
}
void test(){
System.out.println(t1+" ");
}
}
当在构造函数中进行初始化的时候,对于有多个构造函数的类,必须在每个构造函数中都对该final实例变量进行初始化,但是各构造函数可以使用不同的值来进行初始化,例如
class T1{
final private int t1;
T1(){
t1=10;
}
T1(int c){
t1=20;
}
void test(){
System.out.println(t1+" ");
}
}
对于final修饰的实例变量来讲,上述三种初始化方式各有优缺点,a,b方法类似,均不需要再去每个构造函数中对该实例变量进行初始化,c方法可以针对不同的构造函数对final修饰的实例变量进行特定的初始化。
2)类变量
类变量通常也叫静态变量,是类中使用static关键字修饰的成员变量。对于其来说,程序员未显示指定初始值的类变量,系统会自动赋初始值,例如
class T1{
static private int t1;
void test(){
System.out.println(t1+" ");
}
}
输出结果为: 0 系统自动给int型的类变量t1赋初始值0.
对于有final修饰的类变量,例如 final static int t1来讲,系统不会进行默认赋值,初始化需要按照如下两种方式进行:
a.在定义变量的时候进行初始化,例如
class T1{
static private int t1=10;
void test(){
System.out.println(t1+" ");
}
}
b.在静态初始化块中进行初始化,例如
class T1{
final static private int t1;
void test(){
System.out.println(t1+" ");
}
static{
t1=10;
}
}
与实例变量最大的不同在于,对于final修饰的类变量来讲,不能在构造函数中进行初始化的。
3)函数中的局部变量
对于局部变量来讲,系统不会进行默认初始化,必须程序员指定初始值。当程序中没有显示的指定这类局部变量的初始值的时候,程序会编译出错
class T1{
void test1(){
int a;
System.out.println(a);
}
}
具体情况如下:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The local variable a may not have been initialized
at T1.test1(TestString.java:5)
at TestString.main(TestString.java:26)因此,在使用局部变量的时候,需要注意给局部变量进行初始化。
注意:上述情况都是针对基本类型,包括byte, short, int, long及String类型来说,对于引用类型来讲,所有的必须程序员自己进行显示的初始化,如下所示:
class T0{
}
class T1{
T0 t;
void test1(){
System.out.println(t.toString());
}
}
上述代码没有对t进行初始化,因此程序运行时,会抛出NullPointerException
需要进行如下改进:
class T0{
}
class T1{
T0 t=new T0();
void test1(){
System.out.println(t.toString());
}
}
在定义的时候,或者其他可以的地方对t进行显示的初始化就好了。
先暂时整理到这里了,有什么不对或者不清楚的地方欢迎大家留言指出。