首先定义父类A:
public class A {
static int staticNum = 1; // 1.
static{
System.out.println("父类静态代码块加载");
System.out.println("静态变量staticNum=" + staticNum);
} // 2.
int num = 3; // 6.
{
System.out.println("父类设置普通变量num=" + num);
System.out.println("父类普通代码块,此时的staticNum=" + staticNum);
} // 7.
public A(){
System.out.println("父类的构造方法被加载,此时num="+ num);
} // 8.
}
然后定义子类B继承父类A:
public class B extends A{
static{
System.out.println("子类静态方法块被加载");
staticNum = 10;
System.out.println("子类修改静态变量staticNum=" + staticNum);
} // 3.
{
System.out.println("子类普通被方法加载");
num = num + 3;
System.out.println("子类设置num = num + 3,此时num的值为:" + num);
} // 9.
public B(){
System.out.println("子类构造方法被加载");
} // 10.
public static void main(String[] args){
System.out.println("---------类已经加载到内存,可以进行实例化----------"); // 4.
B b = new B(); // 5.
}
}
执行的结果为:
父类静态代码块加载
静态变量staticNum=1
子类静态方法块被加载
子类修改静态变量staticNum=10
---------类已经加载到内存,可以进行实例化----------
父类设置普通变量num=3
父类普通代码块,此时的staticNum=10
父类的构造方法被加载,此时num=3
子类普通被方法加载
子类设置num = num + 3,此时num的值为:6
子类构造方法被加载
丛结果中可以看到:
首先执行的是A和B的静态代码(在类的初始化时执行),B在继承A的情况下,会先按顺序执行A中的静态代码(静态变量赋值、静态代码块执行),之后执行B的静态代码。
在类的初始化完成后就可以进行实例化了,在类的实例化(严格来说应该叫对象的实例化)过程中会先执行类的构造代码块,之后执行构造器内的函数之后完成对象的创建。需要注意的是,B继承A的情况下,需要等A的构造器执行后,才可以调用B的构造器。