哪位大神讲解下下面代码的执行过程及原因

package com.tutorialspoint;

public class Test1 {
static{
System.out.println("1");
}
public Test1(){
System.out.println("2");
}
public static void main(String[] args) {
Test1 test1 = new test2();
test1 = new test2();
}
}
class test2 extends Test1{
static{
System.out.println("A");
}
public test2(){
System.out.println("B");
}
}

1a2b2b
静态代码块是在类加载的时候就被执行,你的test2继承字test1,当加载test2的时候就会执行test1和test2的两个static代码块的代码。所以先打印1a

创建test2实例的时候,会调用test2的构造方法,而在调用子类构造方法的时候会先调用父类构造方法,所以会打印出2b

由于静态代码块只会在类加载的时候执行一次,所以你再次创建test2实例的时候只会打印出2b,没有1a

代码执行过程,跟踪一遍就能明白的。但是需要结合底层JVM的处理流程来看,如果真有心学习,建议系统地看下JVM的理论知识。
推荐一个非常好的博客:http://blog.csdn.net/luanlouis/article/details/50529868看下他的JVM专栏。