Java变量自动初始化


在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进行显示的初始化就好了。


先暂时整理到这里了,有什么不对或者不清楚的地方欢迎大家留言指出。





  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值