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
尤其注意上面输出中的加红色的部分!
时间: 2024-10-27 05:17:46