public class Son1 extends Father {
    static
      {
         System.out.println("a");
      }
    public Son1() {
        System.out.println("1");
    }
    public static void main(String[] args) {
        Son1 son=new Son1();
        son=new Son1();
       
    }}class Father {
    static
    {
       System.out.println("b");
    }
    public Father() {
        System.out.println("2");
    }    }
请问其执行流程是怎么样的,为什么会这样啊

解决方案 »

  1.   

    这已经是java版块老掉牙的知识点了
    楼主在当前的程序中只要明白二点即可:
    1.子类构造时必先执行其父类构造函数
    2.静态块先于构造函数执行
    但这个程序对类的加载及初始化的说明还是具有很大的局限性,你现在这个程序中只有静态块,如果再有非静态块的,又会让你傻了眼所以楼主可以百度一下:java类加载顺序
    以便详细了解其执行过程
      

  2.   

    你主要要搞清楚java类加载顺序 
    这个是sun规定的没有什么为什么
      

  3.   

    结果为:
    b
    a
    2
    1
    2
    1Son1 son=new Son1(); 
    首先调用父类Father的静态代码块,再调用自己的静态代码块,接着调用父类Father的构造函数,再调用自己的构造函数(总是优先调用父类的,而且静态代码块优先于构造函数)
    son=new Son1(); 
    静态代码块只会被调用一次,即初始化一次后就不再调用,所以此处直接调用父类Father的构造函数,再调用自己的构造函数
      

  4.   

    用{}括起来的称为代码块,用static修饰称为静态代码块。两者的相同点是程序首先执行代码块,两者的不同点
    是无论新建多少对象,静态代码块只调用一次,而代码块可以多次调用。