欢迎来到天天文库
浏览记录
ID:57577845
大小:56.00 KB
页数:7页
时间:2020-08-27
《数据初始化顺序.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、数据初始化顺序一、前言 数据的初始化顺序在编写高效率的代码的时候有着决定性的作用!作为一个java开发者,弄懂这快内容是最基本的。二、初始化顺序 在一个类中,初始化的顺序是由变量在类中定义的顺序决定的,即使变量定义大量分布在方法定义的中间,那些变量仍会在调用任何方法之前得到初始化--甚至在构造方法执行之前。 那么通过下面这个例子来看看: //:OrderOfInitialization.java//Demonstratesinitializationorder.//Whentheconstructor
2、iscalled,tocreatea//Tagobject,you'llseeamessage:classTag{Tag(intmarker){System.out.println("Tag("+marker+")");}}classCard{Tagt1=newTag(1);//BeforeconstructorCard(){//Indicatewe'reintheconstructor:System.out.println("Card()");t3=newTag(33);//Re-initializet3}Tagt
3、2=newTag(2);//Afterconstructorvoidf(){System.out.println("f()");}Tagt3=newTag(3);//Atend}publicclassOrderOfInitialization{publicstaticvoidmain(String[]args){Cardt=newCard();t.f();//Showsthatconstructionisdone}}///:~ 代码执行的结果: Tag(1)Tag(2)Tag(3)Card()Tag(
4、33)f()在Card中,Tag对象的定义故意到处散布,以证明它们全都会在构建器进入或者发生其他任何事情之前得到初始化。除此之外,t3在构建器内部得到了重新初始化因此,t3句柄会被初始化两次,一次在构建器调用前,一次在调用期间(第一个对象会被丢弃,所以它后来可被当作垃圾收掉)。从表面看,这样做似乎效率低下,但它能保证正确的初始化——若定义了一个过载的构建器,它没有初始化t3;同时在t3的定义里并没有规定“默认”的初始化方式,那么会产生异常。 三、静态数据的初始化 若数据是静态的(static),那么同样的事情就会发生
5、;如果它属于一个基本类型(主类型),而且未对其初始化,就会自动获得自己的标准基本类型初始值;如果它是指向一个对象的句柄,那么除非新建一个对象,并将句柄同它连接起来,否则就会得到一个空值(NULL)。如果想在定义的同时进行初始化,采取的方法与非静态值表面看起来是相同的。但由于static值只有一个存储区域,所以无论创建多少个对象,都必然会遇到何时对那个存储区域进行初始化的问题。下面这个例子可将这个问题说更清楚一些://:StaticInitialization.java//Specifyinginitialvalues
6、ina//classdefinition.classBowl{Bowl(intmarker){System.out.println("Bowl("+marker+")");}voidf(intmarker){System.out.println("f("+marker+")");}}classTable{staticBowlb1=newBowl(1);Table(){System.out.println("Table()");b2.f(1);}voidf2(intmarker){System.out.println(
7、"f2("+marker+")");}staticBowlb2=newBowl(2);}classCupboard{Bowlb3=newBowl(3);staticBowlb4=newBowl(4);Cupboard(){System.out.println("Cupboard()");b4.f(2);}voidf3(intmarker){System.out.println("f3("+marker+")");}staticBowlb5=newBowl(5);}publicclassStaticInitializa
8、tion{publicstaticvoidmain(String[]args){System.out.println("CreatingnewCupboard()inmain");newCupboard();System.out.println("CreatingnewCupboard()inmain");newCupboard();//re-
此文档下载收益归作者所有