前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初始化

初始化

作者头像
fanfan
发布2022-05-07 13:51:03
7580
发布2022-05-07 13:51:03
举报
文章被收录于专栏:编程思想之路

在编程时,初始化与清理的工作影响着一个程序的安全性,明白初始化的顺序以及其他相关问题可以很有效的避免运行时的对象空指针的问题,以及基本类型数据的值问题

基本数据类型的初始化

1,基本数据类型分别有对应的默认的初始化值

代码语言:javascript
复制
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,引用数据类型的默认初始化:

代码语言:javascript
复制
/**
	 * 打印出对象的默认值
	 */
	private void initObject(){
		
		System.out.println("String_str:  "+str);
	}

结果为:

引用数据类型默认的初始值为null,也就是说如果要使用引用类型数据,必须要进行显示初始化,否则会在运行时出现空指针异常

2,引用数据类型的显示初始化,

对于引用数据类型,可以调用构造器进行初始化,这也是构造器的由来---实现对象的初始化

代码语言:javascript
复制
String str = new String();

利用构造器初始化时,打印出的结果为“”,而不是null,如下图所示,这样在使用时表示,已经为该对象分配了内存空间,只是对象的内容长度为“”,而未初始化时表示未为对象分配内存空间

String还可以使用别的方式进行初始化

代码语言:javascript
复制
String str = new String("ww");

或者

代码语言:javascript
复制
String str = "ww";

初始化顺序

程序中有可能有基本数据类型,引用数据类型,静态域,非静态域即实例域,局部变量,有时候需要相互调用,那么初始化的顺序在很大程度上可以决定运行时的空指针异常,接下来是分析初始化顺序

因为基本数据类型有默认的初始化值,所以不用考虑在内,主要是引用数据类型的初始化顺序,

有三个类,

代码语言:javascript
复制
public class DataClass {

	public DataClass(String str) {
		// TODO Auto-generated constructor stub
		System.out.println("DataClass:  "+str);
	}
}

还有它的子类:

代码语言:javascript
复制
public class SubDataClass extends DataClass{

	public SubDataClass(String  str) {
		super(str);
		// TODO Auto-generated constructor stub
		System.out.println("SubDataClass:  "+str);
		
	}

}

还有SubDataClass的子类:

代码语言:javascript
复制
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的父类,

然后在一个类中去创建这些类的对象

代码语言:javascript
复制
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类的对象打印输出结果;

代码语言:javascript
复制
FiledInitOrder order = new FiledInitOrder();

输出结果为:

根据输出结果,可以看到3条信息

1,在调用FiledInitOrder构造器时先初始化成员变量

2,成员变量初始化的顺序为静态成员变量,然后实例成员变量

3,在调用构造器进行初始化时,如果有父类,先初始化父类构造器,从最顶端的父类开始,例如本例中,

在创建ThirdDataClass对象时,先初始化DataClass,再初始化SubDataClass,然后再调用ThirdDataClass构造器

在编程中大量的错误是由不正确的初始化造成的,有了构造器后,java可以很好的进行初始化及清理,保证安全

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本数据类型的初始化
  • 引用数据类型的初始化
  • 初始化顺序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档