最近在写代码时,发现一个问题:同样的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类型在对象实例创建后才会被初始化,且初始化顺序如下:
静态构造->块构造块->构造方法