`

JAVA面试题解惑系列(一)——类的初始化顺序

阅读更多
removed.

请到博文下载PDF文件:http://zangweiren.iteye.com/blog/241218
105
9
分享到:
评论
86 楼 map612 2011-11-25  
补了一堂课,真值。这种东西还是多学点好
85 楼 jwx0925 2010-05-26  
老大,为什么删了啊??
84 楼 xiaolv 2010-05-20  



很好!
学习很多啊!
83 楼 smartepsh 2010-04-21  
看来我在Java混的还是短。。。这么牛的人一直没发现。好文章,正好解决了我的问题。
82 楼 wzju64676266 2009-12-01  
zhangyou1010 写道
博主写的不错,但我有个疑问。如果代码按下面那样写:

package Test;

public class TestInitOrder {
	
	//静态初始化块
	{
	
		System.out.println("静态初始化块");
		System.out.println(staticFeild);
	}
	
	//	静态变量
	public static String staticFeild = "静态变量";
	
	//变量
	public String feild = "变量";
	
	//初始化块
	{
		System.out.println(feild);
		System.out.println("初始化块");
	}
	
	//构造器
	TestInitOrder() {
		System.out.println("构造器");
	}
	public static void main(String args[]) {
		new TestInitOrder();
	}

}


debug的时候停在System.out.println("静态初始化块");这一行,会发现staticFeild 已经初始化了,按照博主的说法,静态变量和静态初始化块,初始化得次序是按他们在代码中定义的顺序来的,那这样就有矛盾了啊?


另外如果代码这样写:
package Test;

public class TestInitOrder {
	
	//变量
	public String feild = "变量";
	
	//静态初始化块
	{
	
		System.out.println("静态初始化块");
		System.out.println(staticFeild);
	}
	
	//	静态变量
	public static String staticFeild = "静态变量";
	

	
	//初始化块
	{
		System.out.println(feild);
		System.out.println("初始化块");
	}
	
	//构造器
	TestInitOrder() {
		System.out.println("构造器");
	}
	public static void main(String args[]) {
		new TestInitOrder();
	}

} 

debug停在 System.out.println("静态初始化块");这一行,会发现
feild变量也已经初始化了,请问这该怎么解释呢?  谢谢。



//静态初始化块
{

System.out.println("静态初始化块");
System.out.println(staticFeild);
}
你这个叫静态初始化吗?明明是初始化块。静态变量初始化当然会在初始化块前执行了。

       这样才是静态初始化!

         static {

System.out.println("静态初始化块");
System.out.println(staticFeild);
}


81 楼 yzlke 2009-09-25  
谢啦 lz 好东西额
80 楼 emsn 2009-08-20  
zhangyou1010 写道
博主写的不错,但我有个疑问。如果代码按下面那样写:

package Test;

public class TestInitOrder {
	
	//静态初始化块
	{
	
		System.out.println("静态初始化块");
		System.out.println(staticFeild);
	}
	
	//	静态变量
	public static String staticFeild = "静态变量";
	
	//变量
	public String feild = "变量";
	
	//初始化块
	{
		System.out.println(feild);
		System.out.println("初始化块");
	}
	
	//构造器
	TestInitOrder() {
		System.out.println("构造器");
	}
	public static void main(String args[]) {
		new TestInitOrder();
	}

}


debug的时候停在System.out.println("静态初始化块");这一行,会发现staticFeild 已经初始化了,按照博主的说法,静态变量和静态初始化块,初始化得次序是按他们在代码中定义的顺序来的,那这样就有矛盾了啊?


另外如果代码这样写:
package Test;

public class TestInitOrder {
	
	//变量
	public String feild = "变量";
	
	//静态初始化块
	{
	
		System.out.println("静态初始化块");
		System.out.println(staticFeild);
	}
	
	//	静态变量
	public static String staticFeild = "静态变量";
	

	
	//初始化块
	{
		System.out.println(feild);
		System.out.println("初始化块");
	}
	
	//构造器
	TestInitOrder() {
		System.out.println("构造器");
	}
	public static void main(String args[]) {
		new TestInitOrder();
	}

} 

debug停在 System.out.println("静态初始化块");这一行,会发现
feild变量也已经初始化了,请问这该怎么解释呢?  谢谢。

你的//静态初始化块实际上并非静态,没有加static,所以它只是个初始化块,才会出现你运行的结果,如果你在该块前面加了static,是不能通过编译的。静态初始化引用的静态变量,必须在其前面先定义。
79 楼 zhb2432 2009-08-10  
看完 收益非浅!!! 支持楼主 
78 楼 liliugen 2009-06-22  
继承体系的类加载,static型的不管是static变量,还是static代码块都是属于类的.顺序嘛谁在前面先初始化谁.
类加载完毕,才会开始准备生成继承体系的对象,从顶层类开始Object,非static变量,非static代码块,构造器的调用,一个父类的对象出来了,处于可用状态,马上开始下一级的对象的生成工作,一直到没有子类的那个类的对象生成出来.
对象生成工作OVER!
H_eaven 写道
继承体系的类加载,static型的不管是static变量,还是static代码块都是属于类的.顺序嘛谁在前面先初始化谁.
类加载完毕,才会开始准备生成继承体系的对象,从顶层类开始Object,非static变量,非static代码块,构造器的调用,一个父类的对象出来了,处于可用状态,马上开始下一级的对象的生成工作,一直到没有子类的那个类的对象生成出来.
对象生成工作OVER!

  不错,编程思想的解释!
77 楼 zhangyou1010 2009-05-24  
博主写的不错,但我有个疑问。如果代码按下面那样写:

package Test;

public class TestInitOrder {
	
	//静态初始化块
	{
	
		System.out.println("静态初始化块");
		System.out.println(staticFeild);
	}
	
	//	静态变量
	public static String staticFeild = "静态变量";
	
	//变量
	public String feild = "变量";
	
	//初始化块
	{
		System.out.println(feild);
		System.out.println("初始化块");
	}
	
	//构造器
	TestInitOrder() {
		System.out.println("构造器");
	}
	public static void main(String args[]) {
		new TestInitOrder();
	}

}


debug的时候停在System.out.println("静态初始化块");这一行,会发现staticFeild 已经初始化了,按照博主的说法,静态变量和静态初始化块,初始化得次序是按他们在代码中定义的顺序来的,那这样就有矛盾了啊?


另外如果代码这样写:
package Test;

public class TestInitOrder {
	
	//变量
	public String feild = "变量";
	
	//静态初始化块
	{
	
		System.out.println("静态初始化块");
		System.out.println(staticFeild);
	}
	
	//	静态变量
	public static String staticFeild = "静态变量";
	

	
	//初始化块
	{
		System.out.println(feild);
		System.out.println("初始化块");
	}
	
	//构造器
	TestInitOrder() {
		System.out.println("构造器");
	}
	public static void main(String args[]) {
		new TestInitOrder();
	}

} 

debug停在 System.out.println("静态初始化块");这一行,会发现
feild变量也已经初始化了,请问这该怎么解释呢?  谢谢。
76 楼 xinsrxh 2009-05-23  
不错不错,收益非浅
75 楼 shen0405247 2009-05-06  
以前 不是很清楚,看了你的文章 清晰多了
74 楼 usiboy 2009-02-03  
非常不错的一篇文章,支持楼主!
73 楼 brilliant2008 2009-01-29  
感谢楼主,牛年更牛
72 楼 77595009 2009-01-02  
谢谢,您归纳的很好,读后很受益
71 楼 makai512 2008-12-15  
70 楼 walsh 2008-12-11  
楼主写的真详细,谢谢楼主!
69 楼 liu8899 2008-11-05  
学习学习了,楼主大 好人
68 楼 ludaojuan21 2008-10-23  
拜读了,楼主辛苦,谢谢! !
67 楼 xuejianshan 2008-10-08  
面试正需要~~

相关推荐

Global site tag (gtag.js) - Google Analytics