继承与初始化


了解包括继承在内的初始化全过程,对初始化过程中发生的一切有一个全局性的把握是很有益的事情。先思考一下下例的输出结果。

class Insect{
    private int i = 9;
    protected int j;
    public Insect() {
        System.out.println("i = " + i + ", j = " + j);
        j=39;
    }
    private static int x1 = printInt("static Inset.x1 initialezed");
    static int printInt(String s){
        System.out.println(s);
        return 47;
    }
}

public class Beetle extends Insect{
    private int k = printInt("Beetle.k initialized");
    public Beetle() {
        System.out.println("k = " + k);
        System.out.println("j = " + j);
    }
    private static int x2 = printInt("static Beetle.x2 initialized");
    public static void main(String[] args) {
        Beetle beetle = new Beetle();
    }
}

在Beetle上运行main方法时,加载器启动并加载Beetle的编译文件(Beetle.class),加载过程中编译器注意到他有一个基类,于是继续加载基类编译文件,然后开始初始化基类中的static,然后初始化导出类的static,到此必要的类已加载完毕,可以创建对象了。

首先对象中的基本类型都会被设置为默认值,引用设置为null(其实就是将对象内存全置为0)。然后基类的构造器被调用(构造器的执行过程是先初始化成员变量,再调用构造器方法),最后是导出类的构造器被调用。

因此上例的输出结果如下:

static Inset.x1 initialezed
static Beetle.x2 initialized
i = 9, j = 0
Beetle.k initialized
k = 47
j = 39

Copyright © jverson.com 2019 all right reserved,powered by Gitbook 20:29

results matching ""

    No results matching ""