现在的位置: 首页 > 综合 > 正文

初始化顺序

2014年02月01日 ⁄ 综合 ⁄ 共 1161字 ⁄ 字号 评论关闭

一.首先,写一个实验类

package test;

public class Hello {
	int num;
	String str="hello";
	Bowl bow1=new Bowl(1);
	static{
		System.out.println("static initialization");
	}
	Bowl bow2=new Bowl(2);
	public Hello(){
		System.out.println(str);
		System.out.println(num);
		num=10;
		System.out.println(num);
	}
	public static void main(String[] args) {
		Hello h=new Hello();		
	}
	static Bowl bow3=new Bowl(3);
}
class Bowl extends SuperBowl{
	public Bowl(int marker){
		System.out.println("Bowl("+marker+")");
	}
}
class SuperBowl{
	static{
		System.out.println("super class static block");
	}
	public SuperBowl(){
		System.out.println("super class");
	}
}

输出结果:

static initialization
super class static block
super class
Bowl(3)
super class
Bowl(1)
super class
Bowl(2)
hello
0
10

规则顺序

1.静态块或静态变量首先被初始化

2.遵循父类优先

3.成员变量初始化

4.构造函数初始化

二.现已类Dog来详细说明创建Dog对象的过程,即当程序执行 new Dog()时所发生的一系列步骤

1.尽管没有显示的使用static关键字,但是这个构造函数实际上是一个静态方法。所以当Dog类型的对象首次被创建,或者当Dog类型的静态方法或静态字段被访问时,java解释器必须通过classpath定位到Dog.class字节码文件。

2.当Dog.class被加载(同时创建了对应的Class对象)然后所有的static方法被初始化(对于使用Class.forName())方法获取Class对象是这样的)。当Class对象第一次被加载时,static初始化只执行一次。

3.当你创建一个new Dog(),构造函数便为这个Dog对象在heap上分配足够的存储空间。

4.对象的存储空间被置0,并自动的为该对象的字段设置default值(比如int设置为0,应用类型设置为null).

5.初始化对象成员变量,设置为相应的值。

6.执行构造函数。执行构造函数的时候如果有父类,则向执行父类的相关初始化,然后执行父类的构造函数,最后在执行自己的构造函数。

抱歉!评论已关闭.