日期:2014-05-20  浏览次数:20646 次

求大神解释一下运行结果
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"); }

------解决方案--------------------
加载顺序是这样先父类再子类
静态变量、语句块
变量、语句块
构造方法
------解决方案--------------------
对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
------解决方案--------------------
语句块,优先于方法执行。。。
------解决方案--------------------
那是一个语句块,在JVM加载初始化过程,先于一般方法被执行。
------解决方案--------------------
语句块,如果前面有static就说明是静态语句块,具体的加载顺序如1楼所述。。
------解决方案--------------------
运行结果:
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");