java数据初始化

最近在写代码时,发现一个问题:同样的int数据类型,声明时,有时需要初始化,有时不用初始化(java自动帮你初始化)。虽然这个小问题编译器会自动提示错误,但作为一个程序员来说,数据类型什么时候会被自动初始化,还是了解清楚为好。下面开始探索:

1.基本数据类型的初始化

示例代码:

public class Test03 {
	public static void main(String args[]){
		int i;
		System.out.println(i);
	}
}
运行时会出现以下错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	num1 cannot be resolved or is not a field

	at com.fcy.test01.Test03.main(Test03.java:16)

解决方案:只要将变量i初始化即可,即:

public class Test03 {
	public static void main(String args[]){
		int i =0;
		System.out.println(i);
	}
}

修改代码后,程序输出结果:0


再看下面的代码:

class A{
	String name;
	int age;
	public A(String name){
		this.name=name;
	}
}
public class Test03 {
	public static void main(String args[]){
		A a=new A("aaaa");
		System.out.println(a.age);
	}
}

此时,创建对象时,对象实例a中的age属性并为赋初值,编译器也没有报错,运行结果:0

总结:java中,类的成员变量不用赋初始值,系统会自动赋值,byte、short、int、long默认初值为0,float、double默认初值为0.0,char默认初值为\u0000,boolean默认初值为false;而局部变量必须赋初始值,否则就会报错。


2.数组初始化

请看以下代码:

class A{
	int a[];
	Integer b[];
	public A(){
		a=new int[2];
		b=new Integer[2];
	}
}
public class Test03 {
	public static void main(String args[]){
		A a=new A();
		System.out.println(a.a[1]);	//输出0
		System.out.println(a.b[1]);	//输出null
		int c[]=new int[2];
		Integer d[]=new Integer[2];
		System.out.println(c[1]);	//输出0
		System.out.println(d[1]);	//输出null
	}
}
输出结果为:

0
null
0
null

总结:无论数组作为类的成员变量还是局部变量,都会被初值化;对象(引用类型)的初始化默认值为null。

3.static类型变量初始化时机

有以下代码:

//代码1
public class Test03 {
	int num1=num2+2;	//num2的调用在声明之前
	int num2=12;
	public static void main(String args[]){
		System.out.println(new Test03().num1);
	}
}
//代码
public class Test03 {
	int num1=num2+2;	//num2的调用在声明之前
	static int num2=12;
	public static void main(String args[]){
		System.out.println(new Test03().num1);
	}
}

两段代码中,num2的调用都在声明前,所不同的是,代码2中将num2声明成了static变量,那么以上代码有没有错误呢?

以上代码中,代码1是有错的,错误很显然:调用num2时,num2并未声明,不能调用;代码2则是正确的,static类型的变量、方法在对象创建前面初始化,而成员变量随着类的创建初始化,所以在num1调用num2时,num2已经存在于内存中,当然可以调用了。

注意:static类型变量、方法属于类,不能在方法中定义static变量,如以下代码是错误的

public static void main(String args[]){
		static int e=3;
		A a=new A();
		System.out.println(new Test03().num1);
}

4.static类型初始化时机

请看如下代码:

class A{
	int a[];
	Integer b[];
	public A(){
		a=new int[2];
		b=new Integer[2];
		System.out.println("构造方法");
	}
	{	System.out.println("构造块");   }
	static{
		System.out.println("静态构造块");
	}
}
//代码
public class Test03 {
	int num1=num2+2;	//num2的调用在声明之前
	static int num2=12;
	public static void main(String args[]){
		A a=null;
		System.out.println("初始化对象实例");
		a=new A();
	}
}

运行结果:

初始化对象实例
静态构造块
构造块
构造方法
从以上结果可以看出,static类型在对象实例创建后才会被初始化,且初始化顺序如下:

静态构造->块构造块->构造方法





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值