看看下面这个程序的运行结果:指出下面程序的运行结果 : 【基础】
class A{
static{
System.out.print("1");
}
public A(){
System.out.print("2");
}
}
class B extends A{
static{
System.out.print("a");
}
public B(){
System.out.print("b");
}
}
public class Hello{
public static void main(String[] ars){
A ab = new B();
ab = new B(); 
}

解决方案 »

  1.   

    1a2b2b
    对不对?
    类变量和类初始化块组成一个叫clinit()的方法,在连接时间就运行了,而且这个运行顺序也遵循父类子类的关系。
    实例初始化(包括构造器)组成一个叫 init()的方法,在初始化时间运行,也是按照父类子类顺序运行。
    clinit(),就运行一次(在第一次主动请求时间,什么是主动请求呢?有6种情况,自己去找吧),init()方法只要新生成对象就会执行!
      

  2.   

    有个地方不明白:为什么可以这样写??static{ 
    System.out.print("1"); 
    你大家指点一下  
      

  3.   


    打印结果为:1a2b2bstatic 的初始化段在这个类第一次被ClassLoader装载时执行。A ab = new B(); 输出了 1a2b因为static 的初始化段在这个类第一次被ClassLoader装载时执行, 所以先输出static{}里面的东西在输出构造方法里的东西
    可是 ab = new B(); 输出了 2b  ???? 怎么和A ab = new B(); 输出的不一样???