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