一道题反映Java的类初始化过程

Java的类初始化过程:

1. 父类的static成员变量,static语句块。

2. 子类的static成员变量,static语句块。

3. 父类的普通成员变量,构造函数。

4. 子类的普通成员变量,构造函数。

注意:如果下面一句话没看懂,没关系,看下面的一个例子就明白了~

如果子类覆盖了父类的成员函数,该成员函数又在上面过程3中的构造函数中被调用,则此时调用的是子类的那个成员函数,如果成员函数中还含有子类中没有被初始化的普通成员变量,则若是int类型,默认初始化为0,若为对象类型,默认初始化为null.

Java实例如下:

abstract class Base {
    public int age = getNumber(100);
    static int sage = getNumber(50);
    static {
        System.out.println("base static block");
    }
    public Base() {
        System.out.println(age);
        System.out.println("base start");
        draw();
        System.out.println("base end");
    }
    static int getNumber(int base) {
        System.out.println("base.getNumber int" + base);
        return base;
    }
    public void draw() {
        System.out.println("base.draw");
    }
}

public class InitializeOrder extends Base {
    public int age = getNumber(1001);
    private int _radius = getNumber(10);
    static int sage = getNumber(250);
    static {
        System.out.println("subclass static block");
    }
    public InitializeOrder(int radius) {
        _radius = radius;
        System.out.println(age);
        System.out.println("initializeOrder initialized");
    }
    public void draw() {
        System.out.println("initializeOrder.draw" + _radius);
    }
    
    public static void main(String[] args) {
        new InitializeOrder(100);
    }
}

输出结果:

base.getNumber int50
base static block
base.getNumber int250
subclass static block
base.getNumber int100
100
base start
initializeOrder.draw0
base end
base.getNumber int1001
base.getNumber int10
1001
initializeOrder initialized

尤其注意上面输出中的加红色的部分!

posted @ 2015-10-29 16:44  lasclocker  阅读(205)  评论(0编辑  收藏  举报