继承和初始化

楔子

java8学习笔记

继承和初始化

当执行java Beetle,首先会试图访问Beetle类的mian() 方法(一个静态方法),加载器启动并找出Beetle类的编译代码(在名为Beetle.class的文件中)。加载过程中,编译器注意到有个基类,于是继续加载基类。不论是否创建基类的对象,基类都会和被加载。

如果基类还存在自身的基类,那么第二个基类也将被加载,依次类推。接下来,根基类(Insect) 的static 的初始化开始执行,接着是派生类。(派生类中的static的初始化可能依赖基类成员是否被正确地初始化)。

至此,必要的类都加载完毕,可以创建对象了。首先,对象中的所有基本变量都被置为默认值,对象引用被设定为null——这是通过将对象内存设为二进制零值一举生成的。接着会调用基类的构造器。基类构造器和派生类构造器一样以相同的顺序经历相同的过程。当基类构造器完成后,实例变量按照文本顺序初始化,最终,构造器的剩余部分被执行。

class Insect {
    private int i = 9;
    protected int j;

    Insect() {
        System.out.println("i = " + i + ", j = " + j);
        j = 39;
    }

    private static int x1 = printInit("static Insect.x1 initialized");

    static int printInit(String s) {
        System.out.println(s);
        return 47;
    }
}

public class Beetle extends Insect {
    private int k = printInit("Beetle.k.initialized");

    public Beetle() {
        System.out.println("k = " + k);
        System.out.println("j = " + j);
    }

    private static int x2 = printInit("static Beetle.x2 initialized");

    public static void main(String[] args) {
        System.out.println("Beetle constructor");
        Beetle b = new Beetle();
    }
}

/*
* 继承和初始化
* 当执行java Beetle,首先会试图访问Beetle类的`mian()` 方法(一个静态方法),加载器启动并找出Beetle类的编译代码(在名为Beetle.class的文件中)。加载过程中,编译器注意到有个基类,于是继续加载基类。不论是否创建基类的对象,基类都会和被加载。

如果基类还存在自身的基类,那么第二个基类也将被加载,依次类推。接下来,根基类(Insect) 的static 的初始化开始执行,接着是派生类。(派生类中的static的初始化可能依赖基类成员是否被正确地初始化)。

至此,必要的类都加载完毕,可以创建对象了。首先,对象中的所有基本变量都被置为默认值,对象引用被设定为null——这是通过将对象内存设为二进制零值一举生成的。接着会调用基类的构造器。基类构造器和派生类构造器一样以相同的顺序经历相同的过程。当基类构造器完成后,实例变量按照文本顺序初始化,最终,构造器的剩余部分被执行。
*
* */


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章