`
ifWhileCaseFor
  • 浏览: 7841 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

类的初始化顺序

 
阅读更多
引用:臧圩人JAVA面试解惑系列
http://zangweiren.iteye.com/blog/1036327
类的初始化顺序
(静态变量 静态初始化块)>(变量 初始化块)>构造器
测试代码如下:
public class TestInitial {
	public static void main(String[] args){
		new Initial();		
	}
}
class Initial{
	//静态变量
	public static String str = "1.静态变量";
	//普通常量
	public String str1 = "2.常量";
	//静态初始化块
	static{
		System.out.println(str);
		System.out.println("1.静态初始化块");
	}
	//普通初始化块
	{
		System.out.println(str1);
		System.out.println("2.普通初始化块");
	}
	//构造器
	public Initial(){
		System.out.println("3.构造器");
	}
}

输出结果:
1.静态变量
1.静态初始化块
2.常量
2.普通初始化块
3.构造器


下面测试继承下的类初始化顺序
public class TestInitialParent {
	public static void main(String[] args){
		new Subexten();
	}
}
class Parent{
	public static String p_field = "父类--静态变量";
	public static String p_field_nomal = "父类--普通变量";
	static{
		System.out.println(p_field);
		System.out.println("父类的静态代码");
	}
	{
		System.out.println(p_field_nomal);
		System.out.println("父类的普通代码");
	}
	public Parent(){
		System.out.println("父类的构造器");
	}
}
class Subexten extends Parent{
	public static String s_field = "子类--静态变量";
	public static String s_field_nomal = "子类--普通变量";
	static{
		System.out.println(s_field);
		System.out.println("子类的静态代码");
	}
	{
		System.out.println(s_field_nomal);
		System.out.println("子类的普通代码");
	}
	public Subexten(){
		System.out.println("子类的构造器");
	}
}

输出结果:
父类--静态变量
父类的静态代码
子类--静态变量
子类的静态代码
父类--普通变量
父类的普通代码
父类的构造器
子类--普通变量
子类的普通代码
子类的构造器

由此可见并不是父类完全初始化之后才进行子类的初始化,实际上子类的静态变量及静态代码块在父类普通变量及普通代码块和构造器初始化之前已经初始化完毕了。

静态变量与静态代码块谁在前则先执行谁,普通变量与普通代码块也是如此;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics