类的初始化中遇到的一个问题

来源:互联网 发布:西安交通大学网络 编辑:程序博客网 时间:2024/04/30 13:56
废话不多说,首先发一段代码:
public class ExplicitStatic2 {public static void main(String[] args) {} static Eat eat = new Eat();/*static{System.out.println();}static Eat eat2 = new Eat();*/}class Eat{static Eat Eat,Eat1;    Cup cup1 = new Cup(1);static Cup cup2;static {Eat1 = new Eat();System.out.println();cup2 = new Cup(2);System.out.println();Eat = new Eat();System.out.println();}Eat(){System.out.println("Eat()");}Cup cup3 = new Cup(3);}class Cup {Cup(int marker) {System.out.println("Cup(" + marker + ")");}void f(int marker) {System.out.println("f(" + marker + ")");}}运行结果:Cup(1)Cup(3)Eat()Cup(2)Cup(1)Cup(3)Eat()Cup(1)Cup(3)Eat()

看到运行结果,相信有些人已经迷惑了,实际上我也迷惑了好久。这里仅仅说说我的看法,并没有找到相关证明。

从主类中可以看到,main()方法中并没有写任何代码,但是,在主类中有一个静态域,就是变量eat。显然静态代码是在类加载时自动执行的,那么,程序的入口便是这个变量eat,那么我们就对它进行始使化。遵循着静态代码先初始化------非静态代码初始化----最后构造函数这个规则,我们一步一步往下运行。首先程序会加载Eat这个类,并对该类中的静态代码初始化,也就是static块会被先初始化。进入static块中,里面有一个eat1 = new Eat(),显然,这个静态变量也要进行初始化,那么,这个时候程序就会从Eat这个类中重新进入,就会又进入到这个块中,但不会再执行创建eat1,因为它是静态的,只占一份内存空间。那为什么程序没有进入System.out.println()这句话呢?这是显而易见的,因为eat1的确还没有创建完成,它还没有对非静态域进行操作,也没执行构造方法,所以,在没完成这两项任务之前,它是不会执行System.out.println()这个的。那么,我们就会想到,不管静态初始化过程中发生了什么,后续过程中一定会打印出Cup(1)  Cup(3)  Eat(),这才代表eat1这个静态变量创建完成。然后,才会找印一行空格,再执行下一个静态变量cup2的创建。后面的过程都基本一样,这里就不详述了!

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 注塑机加热嘴内扣突了怎么办 tpu粘在螺杆上怎么办 注塑机锁模时会有射退动作怎么办 电动车刹车油泵不打油怎么办 cad转pdf颜色浅怎么办 松下多功能传真一体机卡纸怎么办 无刷电机坏了怎么办 6kv高压电机绝缘不合格怎么办? 400t油压机下降太慢怎么办 无法连线到服务器1~1怎么办? 数控车床车角度不亮怎么办 超市存包柜的票不见了怎么办 交货期来不及导致船期延误怎么办 跑1000米中途累怎么办 手指被机器压烂怎么办 机械手不能回归原点该怎么办 前缘送纸纸板翘怎么办 三菱AL 1R.2报警怎么办 工作好但领导不好伺候怎么办 孕妇憋尿憋的小腹疼怎么办 怀孕憋尿憋的小腹疼怎么办 半夜憋尿憋的小腹疼怎么办 新生儿大便次数较多怎么办 母猎生下三天没有奶怎么办 孩孑大便干不爱喝水怎么办 发那科1050报警怎么办 plc模块bf亮了怎么办 plc模块df亮了怎么办 西门子触摸屏进不了主画面怎么办 pos机显示白屏怎么办 洗衣机的门坏了怎么办 西门子洗衣机门坏了怎么办 拆线线断在肉里怎么办 总线绝对值编码器方向反了怎么办 台达伺服报警009怎么办 台达plc禁止上传怎么办? 潜水泵电机启动绕组断线了怎么办? 永磁电机磁没了怎么办 热水器热水管坏了怎么办 松下伺服驱动器坏了怎么办 步进电机功率小了怎么办