在编程时,初始化与清理的工作影响着一个程序的安全性,明确初始化的顺序以及其它相关问题能够非常有效的避免执行时的对象空指针的问题。以及基本类型数据的值问题
基本数据类型的初始化
1,基本数据类型分别有相应的默认的初始化值
public class FiledInit { long l; int i; short s; double d; float f; char c; byte b; boolean bl; public static void main(String[] args) { FiledInit filedInit = new FiledInit(); filedInit.initBasicFiled(); } /** * 打印出基本类型的默认初值 */ private void initBasicFiled() { System.out.println("long_l: "+l); System.out.println("int_i: "+i); System.out.println("short_s: "+s); System.out.println("double_d: "+d); System.out.println("float_f: "+f); System.out.println("char_c: "+c); System.out.println("byte_b: "+b); System.out.println("boolean_bl: "+bl); } }输出结果为:
可是基本数据类型仅仅有作为成员变量时才会有默认的初始化,但假设是方法内部的局部变量。则没有初始化
如图,我在方法内部定义一个int型的变量。在使用时会出现变量没有初始化的错误
2,为基本类型数据指定初始化,成员变量和局部变量均能够,即在定义变量的地方就对变量进行初始化
引用数据类型的初始化
以String为例,观察引用类型的初始化
1。引用数据类型的默认初始化:
/** * 打印出对象的默认值 */ private void initObject(){ System.out.println("String_str: "+str); }
结果为:
引用数据类型默认的初始值为null。也就是说假设要使用引用类型数据,必需要进行显示初始化,否则会在执行时出现空指针异常
2,引用数据类型的显示初始化,
对于引用数据类型,能够调用构造器进行初始化,这也是构造器的由来---实现对象的初始化
String str = new String();利用构造器初始化时,打印出的结果为“”,而不是null,例如以下图所看到的,这样在使用时表示。已经为该对象分配了内存空间,仅仅是对象的内容长度为“”,而未初始化时表示未为对象分配内存空间
String还能够使用别的方式进行初始化
String str = new String("ww");
或者
String str = "ww";
初始化顺序
程序中有可能有基本数据类型。引用数据类型,静态域,非静态域即实例域,局部变量。有时候须要相互调用。那么初始化的顺序在非常大程度上能够决定执行时的空指针异常。接下来是分析初始化顺序
由于基本数据类型有默认的初始化值,所以不用考虑在内,主要是引用数据类型的初始化顺序,
有三个类,
public class DataClass { public DataClass(String str) { // TODO Auto-generated constructor stub System.out.println("DataClass: "+str); } }
还有它的子类:
public class SubDataClass extends DataClass{ public SubDataClass(String str) { super(str); // TODO Auto-generated constructor stub System.out.println("SubDataClass: "+str); } }还有SubDataClass的子类:
public class ThirdDataClass extends SubDataClass { public ThirdDataClass(String str) { super(str); // TODO Auto-generated constructor stub System.out.println("ThirdDataClass: "+str); } }
也就是说。如今 的关系是:DataClass是SubDataClass的父类。SubDataClass是ThirdDataClass的父类,
然后在一个类中去创建这些类的对象
public class FiledInitOrder { DataClass data = new DataClass("data"); static DataClass static_data = new DataClass("static_data"); SubDataClass subData = new SubDataClass("subData"); static SubDataClass static_subData = new SubDataClass("static_subData"); ThirdDataClass thirdData = new ThirdDataClass("thirdData"); static ThirdDataClass static_thirdData = new ThirdDataClass("static_thirdData"); public FiledInitOrder() { // TODO Auto-generated constructor stub System.out.println("FiledInitOrder"); } }
之后,创建FiledInitOrder类的对象打印输出结果;
FiledInitOrder order = new FiledInitOrder();
输出结果为:
依据输出结果。能够看到3条信息
1,在调用FiledInitOrder构造器时先初始化成员变量
2,成员变量初始化的顺序为静态成员变量,然后实例成员变量
3,在调用构造器进行初始化时,假设有父类,先初始化父类构造器。从最顶端的父类開始。比如本例中,
在创建ThirdDataClass对象时。先初始化DataClass,再初始化SubDataClass,然后再调用ThirdDataClass构造器
在编程中大量的错误是由不对的初始化造成的。有了构造器后。java能够非常好的进行初始化及清理,保证安全