class A{
static {
System.out.println("A1");
}
public A(){
System.out.println("A2");
}
{
System.out.println("A3");
}
}
class B extends A{
static{
System.out.println("B1");
}
public B(){
System.out.println("B2");
}
}
public class C {
public static void main(String []args){
new B();
}
}
以上代码的执行结果是:
A1 // A的静态代码块
B1 // B的静态代码块
A3 // A的实例初始化块
A2 // A的构造函数
B2 // B的构造函数
- 类B继承自类A,因此当首次遇到创建B的对象时,首先加载类A(如果尚未加载)。
- 加载类A时,执行A的静态代码块,打印"A1"。
- 接着,因为是创建B的对象,所以加载类B(如果尚未加载),执行B的静态代码块,打印"B1"。
以上便是JVM类加载机制的初始化阶段做的事。
4.类B的构造器B()被调用前,需要先调用父类A的构造器A()。进入A的构造过程:
先执行A的实例初始化块(非静态代码块)(如果有),打印"A3"。
然后执行A的构造函数,打印"A2"。
5.完成A的构造后,继续执行B的构造过程:
先执行B的实例初始化块(如果有),没有,不打印。
打印"B2",这是B的构造函数输出的内容。
实例初始化块&实例变量&实例方法
当你创建一个对象时:
首先,实例变量会被初始化(分配默认值或根据你在类中为它们指定的值进行初始化)。
接着,实例初始化块(如果有的话)会按照它们在类中出现的顺序执行。
然后,构造函数会被调用。
最后,实例方法只有在被显式调用时才会执行。