论坛首页 Java企业应用论坛

Java类的初始化顺序

浏览 11134 次
精华帖 (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();
        
      
	}
       
	

}
   发表时间:2012-04-06  
建议看看《深入Java虚拟机》
0 请登录后投票
   发表时间:2012-04-06  

可以看看这篇文章 http://len-len.iteye.com/admin/blogs/1412463

0 请登录后投票
   发表时间:2012-04-06  
len-len 写道

 

地址应该是 http://len-len.iteye.com/blog/1412463 

0 请登录后投票
   发表时间:2012-04-06  
看看thinking in java就行了。。。
btw:lz你的代码写的有点乱
0 请登录后投票
   发表时间:2012-04-06  
貌似是的,构造方法的位置不定的
0 请登录后投票
   发表时间:2012-04-06  
lz把例子搞复杂了,看看thinking in java就够了。
0 请登录后投票
   发表时间:2012-04-06  
嘿嘿,正是看了think in java才动手实验的
0 请登录后投票
   发表时间:2012-04-06  
  这还上首页。。。。。。
0 请登录后投票
   发表时间:2012-04-06  
不是初始化顺序问题。而是不同的输出方式问题。
建议看一下System.out.println与System.err.println的区别
可以参考一下:
http://blog.csdn.net/sustbeckham/article/details/6267137
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics