java数据初始化

来源:互联网 发布:74ls373与51单片机地址 编辑:程序博客网 时间:2024/05/09 11:51

最近在写代码时,发现一个问题:同样的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 fieldat 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]);//输出0System.out.println(a.b[1]);//输出nullint c[]=new int[2];Integer d[]=new Integer[2];System.out.println(c[1]);//输出0System.out.println(d[1]);//输出null}}
输出结果为:

0null0null

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

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

有以下代码:

//代码1public 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类型在对象实例创建后才会被初始化,且初始化顺序如下:

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





0 0
原创粉丝点击