鉴于前面各楼层的友友们已经回答的很完善了,我在这儿只补充说明一点前面没有提到的,以便楼主更详细的理解类的加载过程。
1,类加载时,是先加载静态成员的,并按代码顺序进行类的静态初始化。然后才从主函数开始执行的。
2,如果把Cups里面的cup1,cup2给初始化,即改为:
复制代码
则执行结果就是:- static Cup cup1= new Cup(88);
- static
- {
- cup1 = new Cup(1);
- cup2 = new Cup(2);
- }
-
- static Cup cup2= new Cup(88);
复制代码 执行结果:- Cup(88)
- Cup(1)
- Cup(2)
- Cup(88)
- Cups()
- Cups()
- Inside main()
- f(99)
复制代码 3.类的加载和静态初始化只有一次。
详细执行过程如下:
用java命令运行Test时,先加载Test.clss;然后对静态成员cup1初始化,加载Cups.class(如果此处之声明Cups 类型成员cup1而没有等号右边的初始化语句,就不会加载Cups类);Cups类加载过程中,按顺序做静态初始化,先是cup1/cup2,但因为只声明而没有初始化语句故跳过,继续执行static静态代码块初始化;调用了Cup类,故再将Cup.class加载进来,调用Cup(int maker)分别对cup1,cup2进行初始化,打印出Cup1 Cup2; 然后调用构造函数Cups(),打印出Cups(),至此,Test中的cup1已经初始化完毕。开始初始化cup2,因为Cups已经加载进内存,所以可以直接调用构造方法Cups(),打印出Cups(),Test中的cup2初始化完毕。这是才开始执行main()函数。后面的执行顺序楼主都懂,此处省略。
|