public class DotNew {
  { System.out.println("ccccc"); }
  DotNew(){
  System.out.println("ddddd"); 
  }
  public class Inner{
    {
     System.out.println("aaaaa");
    }
    public Inner(){
      System.out.println("saadfasdf");
    }
  }
  public static void main(String[] args){
   System.out.println("eeee");
    DotNew dn = new DotNew();
    System.out.println("bbbb");
    DotNew.Inner in = dn.new Inner();
  }

// 特别是这样的语句是什么意思 { System.out.println("ccccc"); }

解决方案 »

  1.   

    对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
      

  2.   

    那是一个语句块,在JVM加载初始化过程,先于一般方法被执行。
      

  3.   

    语句块,如果前面有static就说明是静态语句块,具体的加载顺序如1楼所述。。
      

  4.   

    运行结果:
    eeee
    ccccc
    ddddd
    bbbb
    aaaaa
    saadfasdf
    main函数中首先打印出eeee字符串,继续执行时,由于(静态)语句块先于构造函数执行,先打印出ccccc后打印ddddd,继续执行如上面所述。由于此处为非静态语句块,在实例化类的时候才会调用,所以ccccc在eeee之后,若前面加有static关键字,则其会在编译的时候打印输出,此时ccccc字符串会先于eeee打印。
    public class DotNew{
      static{ 
     System.out.println("ccccc"); 
      }
      DotNew(){
      System.out.println("ddddd"); 
      }
      public class Inner{
        {
         System.out.println("aaaaa");
        }
        public Inner(){
          System.out.println("saadfasdf");
        }
      }
      public static void main(String[] args){
        System.out.println("eeee");
        DotNew dn = new DotNew();
        System.out.println("bbbb");
        DotNew.Inner in = dn.new Inner();
      }
    }
    结果为:
    ccccc
    eeee
    ddddd
    bbbb
    aaaaa
    saadfasdf