锁定老帖子 主题:Java类的初始化顺序
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-04-06
最后修改:2012-04-06
今天看了类的初始化顺序,于是动手测试,发现结果会有变化......
package com.xushiyun; /** * 测试 * * */ class A{ static{ System.out.println("当前执行位置"+"静态代码块AAAA"); } { System.out.println("当前执行位置"+"普通代码块AAAA"); } A(){ System.err.println("当前执行位置"+this.getClass().getName()+"默认构造器"); } } class B{ static{ System.out.println("当前执行位置"+"静态代码块BBBB"); } { System.out.println("当前执行位置"+"普通代码块BBBB"); } B(){ System.err.println("当前执行位置"+this.getClass().getName()+"默认构造器"); } } class C{ static{ System.out.println("当前执行位置"+"静态代码块CCCC"); } { System.out.println("当前执行位置"+"普通代码块CCCC"); } C(){ System.err.println("当前执行位置"+this.getClass().getName()+"默认构造器"); } } class D{ static{ System.out.println("当前执行位置"+"静态代码块DDDD"); } { System.out.println("当前执行位置"+"普通代码块DDDD"); } D(){ System.err.println("当前执行位置"+this.getClass().getName()+"默认构造器"); } } class Bird{ static{ System.out.println("当前执行位置"+"Bird静态代码块"); }; { System.out.println("当前执行位置"+"Bird普通代码块"); } public Bird() { System.err.println("当前执行位置"+this.getClass().getName()+"默认构造器"); } }; class Person{ D d = new D(); static Bird bird = new Bird(); static { System.out.println("当前执行位置"+"Person静态代码块"); new A(); System.out.println("当前执行位置"+"Person静态代码块-------结束"); }; { System.out.println("当前执行位置"+"Person普通代码块"); new B(); System.out.println("当前执行位置"+"Person普通代码块---------结束"); } Person(){ System.err.println("当前执行位置"+this.getClass().getName()+"默认构造器"); new C(); System.err.println("当前执行位置"+this.getClass().getName()+"默认构造器----结束"); } } public class JavaTest { public static void main(String[] args) { new Person(); } } 另外下面这个继承的结果更是千变万化,,,这是java虚拟机的问题吗? class D extends Bird{ static{ System.out.println("当前执行位置"+"静态代码块DDDD"); } { System.out.println("当前执行位置"+"普通代码块DDDD"); } D(){ System.err.println("当前执行位置------默认构造器dddd"); } } class Bird{ static{ System.out.println("当前执行位置"+"Bird静态代码块"); }; { System.out.println("当前执行位置"+"Bird普通代码块"); } public Bird() { System.err.println("当前执行位置------默认构造器Bird"); } }; class Person extends D{ static { System.out.println("当前执行位置"+"Person静态代码块"); }; { System.out.println("当前执行位置"+"Person普通代码块"); } Person(){ System.err.println("当前执行位置-----默认构造器Person"); } } public class JavaTest { public static void main(String[] args) { new Person(); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-04-06
建议看看《深入Java虚拟机》
|
|
返回顶楼 | |
发表时间:2012-04-06
|
|
返回顶楼 | |
发表时间:2012-04-06
len-len 写道
|
|
返回顶楼 | |
发表时间:2012-04-06
看看thinking in java就行了。。。
btw:lz你的代码写的有点乱 |
|
返回顶楼 | |
发表时间:2012-04-06
貌似是的,构造方法的位置不定的
|
|
返回顶楼 | |
发表时间:2012-04-06
lz把例子搞复杂了,看看thinking in java就够了。
|
|
返回顶楼 | |
发表时间:2012-04-06
嘿嘿,正是看了think in java才动手实验的
|
|
返回顶楼 | |
发表时间:2012-04-06
这还上首页。。。。。。
|
|
返回顶楼 | |
发表时间:2012-04-06
不是初始化顺序问题。而是不同的输出方式问题。
建议看一下System.out.println与System.err.println的区别 可以参考一下: http://blog.csdn.net/sustbeckham/article/details/6267137 |
|
返回顶楼 | |