4 回答

TA贡献1890条经验 获得超9个赞
自动动手调试一下就什么都清楚了
java的初始化顺序,静态变量、静态快、变量、初始化块、构造方法,如果在构造方法中调用了重载的构造方法,那第一次调用的构造方法就不会进行对象变量的初始化了
java的构造方法的重载调用只能在第一行,原因也在于此;至于为何这么设计,我也不懂
你的代码里面,先执行的
this("a在类带参构造方法中的值:" + a); // 调用另外一个构造方法
之后又执行的变量和初始化快
用IDE的单步调试看一下就明白了

TA贡献1886条经验 获得超2个赞
public static int a = 0;
static { a = 10; System.out.println("静态代码块在执行a=" + a); }
相当于下面的代码
public static int a;

TA贡献1765条经验 获得超5个赞
因为你存在两个构造函数, 当你在执行第一个构造函数时, 已经转入另外一个构造方法,而在这时你传入的形参为10, 所以在第2个构造方法中n并不是对a的引用, 况且a是int型, 本身就只是常量, 不存在地址的引用, 所以第一条输出语句为你传入的形参10

TA贡献1878条经验 获得超4个赞
Object是所有类的超类,在java的构造其中this或者super必须放在构造器的第一行执行,在没署名的情况下,每个类的构造方法第一行调用super(),这样才能完成父类的初始化(同类中的构造器必然会用一个调用到父类的构造器),
这个过程可能是一个递归构造链,最终回归到Object。
这里用本类带参的构造方法代替了默认的super(),所以讲通过this(String n)这个构造方法来完成父类的初始化,为了调用this(String n),就需要先将它的参数装配好,因此第三行输出的是10.
写出来可能更好理解
[code="java"]
public TestStaticCon(String n) {
[color=red] super();[/color]
System.out.println(n);
System.out.println(a);
}
希望能对你有帮助.
添加回答
举报