java初始化_Java初始化

1) 成员初始化

由于任何方法都可以初始化或使用那个数据,所以在正式使用数据前,若还是强迫程序员将其一一初始化成一个适当的值,就可能不够实际。因此,一个类的所有primitive数据成员都会保证获得一个缺省值,都是0,不同的数据类型意义不一样。当然,句柄会或得null值。

2) 定义初始化

一个直接的做法是在定义数据成员的同时也为其赋值,并且是在构造函数之前。

classMeasurement {booleanb=true;charc='x';inti=47;

}

也可以用相同的方法初始化对象

classMeasurement {

Depth o=newDepth();

}

可以调用一个方法进行初始化

classCInit {inti=f();

}

当然这个方法也可以使用参数

classCInit {inti=f();intk=g(i);

}

但是那些参数不能是尚未初始化的其他数据成员。

classCInitWrong {intj=g(i);inti=f();

}

3) 初始化顺序

在一个类里,初始化的顺序是由变量在类内的定义顺序决定的。即使变量定义大量遍布于方法定义的中间,那些变量仍然会在调用任何方法之前得到初始化,当然在构造函数之前。

classTag {

Tag(intmarker) {

System.out.println("Tag("+marker+")");

}

}classCard {

Tag t1=newTag(1);//Before constructorCard() {//Indicate we're in the constructor:System.out.println("Card()");

t3=newTag(33);//Re-initialize t3}

Tag t2=newTag(2);//After constructorvoidf() {

System.out.println("f()");

}

Tag t3=newTag(3);//At end}publicclassOrderOfInitialization {publicstaticvoidmain(String[] args) {

Card t=newCard();

t.f();//Shows that construction is done}

}

4) 静态数据初始化

Java是相对比较纯洁的OOP语言,纯洁度90%,5%的杂质是primitive types,基础数据类型,还有5%就是静态数据。

静态的成员变量,静态的成员函数,属于类,不属于对象。类是规则,是虚的;对象是实体,是实的。根据类来制造对象。所有类的静态变量是共享的!

类Class与类对象。Java程序启动后,JVM制造一个对象空间,里面所有的东西都是对象,Java动态装载需要的类,需要时装载类的定义,这些类的定义在空间里面就是类对象,这些对象用来代表那些类。There is a class named class!静态的成员变量就在类对象里面,因此它在被装载时初始化!

静态数据成员只在这个类的第一个对象要创建的时候初始化。

classBowl

{publicBowl(intmarker)

{

System.out.println("Bowl("+marker+")");

}voidf1(intmarker)

{

System.out.println("f1("+marker+")");

}

}classTable

{staticBowl bowl1=newBowl(1);//Table 里面还是先初始化这里,最先输出 Bowl(1)---1publicTable()//两个静态域初始化完成后,是构造函数了{

System.out.println("Table()");//输出 Table()---3bowl2.f1(1);//当然该这里了,bowl2已经有了,输出f1(1)---4}voidf2(intmarker)

{

System.out.println("f2("+marker+")");

}staticBowl bowl2=newBowl(2);//Bowl(1)完了,该这里了,初始化Bowl(2),输出 Bowl(2)---2}classCupboard

{

Bowl bowl3=newBowl(3);//终于该我了,下面两个静态的,很牛嘛。输出 Bowl(3),---7;从10又回来了,这下没下面两个什么事情了,因为,是静态的嘛,呵呵,照样输出 Bowl(3),---11;懒得说了,---15staticBowl bowl4=newBowl(4);//同样的,先初始化静态域,输出 Bowl(4),上面的要等一等了,谁让你不是静态域呢?:)---5publicCupboard()//7初始化完毕,构造函数开始

82c77210dfa2f2614b580b70aba5032d.gif;从11又来了;{

System.out.println("Cupboard()");//简简单单的输出,哪有你们上面的那么复杂---8;依旧简简单单的输出 ---12;

82c77210dfa2f2614b580b70aba5032d.gif---16bowl4.f1(2);//bowl4 已经在了,调用它的f1()方法,输出f1(2)---9;从上面来的,bowl4 仍然在,继续输出f1(2)---13;

82c77210dfa2f2614b580b70aba5032d.gif---17}voidf3(intmarker)

{

System.out.println("f3("+marker+")");

}staticBowl bowl5=newBowl(5);//bowl3,你还是再等等吧,我先来,我也是静态域,虽然我在下面,没办法~~~ ---6}classStaticInitialization

{publicstaticvoidmain(String[] args)//从这里开始~~,不过别急,先初始化下面的静态域 table 和 Cupboard。{

System.out.println("Creating new Cupboard() in main");//从9开始才真正的到这里,虽然在 main 里,好惨~~ ---10newCupboard();//new 了一个对象System.out.println("Creating new Cupboard() in main");//从13过来,又来~~你烦不烦~~,继续输出---14newCupboard();//又 new 了一个对象,我为什么要说 又..table.f2(1);//从17回来,f2(1)---18cupboard.f3(1);//f3(1),---19完}staticTable table=newTable();//所以说,实际上是从这里开始先加载 Table 类staticCupboard cupboard=newCupboard();//4完后,该这里了

82c77210dfa2f2614b580b70aba5032d.gif}

总结一下:

1. 类型为Dog的一个对象首次创建时,或者Dog类的静态方法/数据首次访问时,Java解释器必须找到Dog.class。

2. 找到Dog.class后,它的所有的静态初始化模块都会运行。因此,静态初始化仅发生一次。

3. 创建一个new Dog()时,new语句首先会在堆里分配一个足够的空间。

4. 这个空间将会被清除为零,因此Dog中所有的数据成员都得到了缺省值。

5. 执行定义初始化。

6. 执行构造函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值