继承初始化

来源:互联网 发布:java 双亲委派 编辑:程序博客网 时间:2024/04/30 14:08

我们的代码中很多时候会用到继承以及static关键字,但是对于继承中类以及static的初始化过程我们却不一定很清楚,下面举个例子来简单说明其过程:


class Insect {
int i = 9;
int j;
Insect() {
prt("i = " + i + ", j = " + j);
j = 39;
}
static int x1 =prt("static Insect.x1 initialized");
static int prt(String s) {
System.out.println(s);
return 47;
}
}


public class JavaTest1 extends Insect {
int k = prt("Beetle.k initialized");
JavaTest1() {
prt("k = " + k);
prt("j = " + j);
}
static int x2 =prt("static Beetle.x2 initialized");
static int prt(String s) {
System.out.println(s);
return 63;
}
public static void main(String[] args) {
prt("Beetle constructor");
JavaTest1 b = new JavaTest1();
}

对JavaTest1  运行java时,发生的第一件事情是装载程序到外面找到那个类。在装载过程中,装载程序注意它
有一个基础类(即extends 关键字要表达的意思),所以随之将其载入。无论是否准备生成那个基础类的一
个对象,这个过程都会发生(请试着将对象的创建代码当作注释标注出来,自己去证实)。
若基础类含有另一个基础类,则另一个基础类随即也会载入,以此类推。接下来,会在根基础类(此时是
Insect)执行static 初始化,再在下一个衍生类执行,以此类推。保证这个顺序是非常关键的,因为衍生类
的初始化可能要依赖于对基础类成员的正确初始化。
此时,必要的类已全部装载完毕,所以能够创建对象。

结果输出:

static Insect.x1 initialized       
static Beetle.x2 initialized
Beetle constructor
i = 9, j = 0
Beetle.k initialized
k = 63
j = 39








1 0