/**
* @author hwy1782@gmail.com
* @creation date 2010-9-30 下午04:47:19
*
*/
class Insect{
private int i = 9;
protected int j;
private static int x1 = printInit("static Insect.x1 initialized");
public Insect() {
System.out.println("i = "+i+" j = "+j);
j = 39;
}
public static int printInit(String str){
System.out.println(str);
return 47;
}
}
public class Beetle extends Insect{
private int k = printInit("Beelte.k initialized");
// private int x2 = printInit("static Beetle.x2 initialized");
private static int x2 = printInit("static Beetle.x2 initialized");
public Beetle() {
System.out.println("k = "+k);
System.out.println("j = "+j);
}
public static void main(String[] args) {
System.out.println("Beelte Constructor");
Beetle b = new Beetle();
}
}
这两个类之间的关系如下:
在Beetle上运行java时的步骤:
1. 类加载期
第一步: 试图访问Beetle中的main()方法,(该方法为一个static方法)。
第二步: ClassLoader开始启动并Beetle类的编译代码。
第三步: 若在类加载过程中发现有基类的存在(可以通过关键字extends判断),则继续加载其基类。
第四步: 若基类还有基类则继续加载(循环进行)。
第五部: 初始化基类的类属性(即static属性),然后初始化是子类的static属性
至此,类已经加载完毕,可以创建对象。
2. 类创建期
在类加载完毕之后,可以创建对象
第一步: 实例变量中所有基本类型设为默认值,引用设为null
第二步: 调用基类构造函数(自动调用不含参数 或者 super调用含参数 构造函数)
第三步: 实例变量初始化
第四步: 构造器其余部分被执行
完毕!
运行结果如下:
static Insect.x1 initialized
static Beetle.x2 initialized
Beelte Constructor
i = 9 j = 0
Beelte.k initialized
k = 47
j = 39