public class ExA {
private static ExA a = new ExA();
static {
System.out.println("父类--静态代码块");
}
public ExA() {
System.out.println("父类--构造函数");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new ExB();
}
}
程序执行时先找到程序入口即main函数,接着加载和初始化main函数所在的类即ExA,那么第一句就是private static ExA a = new ExA();那么执行这句代码的时候发生了什么?我知道的是先把a设置为null,然后才去赋值为new ExA();关键是new ExA()(第一次创建对象)的时候按道理不是会触发ExA类的加载和初始化吗?但这句代码就在ExA类初始化的第一行,难道要跳过去初始化static { System.out.println("父类--静态代码块"); }吗?还是有别的理解?
第二个疑问:是不是当要首次创建一个类的对象时,前提条件是这个类必须先加载和初始化都完成后才能首次创建类的对象?还是说只要这个类加载了虽然没有初始化就可以创建类的对象了?
class ExB extends ExA {
private static ExB b = new ExB();
static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
public ExB() {
System.out.println("子类--构造函数");
}
}