首页  »   J2SE

求大神过来见见这条题目。

网友分享于:2015-03-22  浏览:0次
求大神过来看看这条题目。。。
package Test_01;


public class Test {
public static int a = 0;


static {
a = 10;
System.out.println("静态代码块在执行a=" + a);
}

{
a = 8;
System.out.println("非静态代码块在执行a=" + a);
}



public Test() {
this("带参构造方法在执行a="+a); // 调用另外一个构造方法
System.out.println("无参构造方法在执行a=" + a);
}


public Test(String n) {
System.out.println(n);
}


public static void main(String[] args) {
Test t = null;
System.out.println("!!!!!!!!!!!!!!!!!!!!!");
t = new Test();
}


}



输出结果是:
静态代码块在执行a=10
!!!!!!!!!!!!!!!!!!!!!
非静态代码块在执行a=8
带参构造方法在执行a=10
无参构造方法在执行a=8


我想问一下,为什么“带参构造方法在执行a=10”这一条语句输出的不是8而是10?
------解决思路----------------------
   虽然我是个菜鸟,但是楼上两位肯定没看仔细。
   首先编译时肯定能编译过的,再其次为什么这样?
   因为执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步:1,super语句;2,显式初始化非静态变量,3,构造代码块。  
  你这里的第一个构造方法,因为用了this关键字(有this关键字,就不可以使用super关键字,所以隐式三步也不会执行,直接转到调用的构造方法),且参数类型是String,调用到有参的构造方法。此时传递的String是:“带参构造方法在执行a=10”;因为此时的a还是10,还没有执行到构造代码块中  a=8;这个语句,所以a不是8。接着在有参构造方法里才会执行构造代码块,也就是重新将a赋值为8。  
   以上就是为什么a为10,为什么不是8的原因。

------解决思路----------------------
看一下JVM中<init>函数的组成部分,解释的非常清楚了.
------解决思路----------------------
http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf

还是直接看这个文档中的相关章节,解释的一清二楚。
------解决思路----------------------
由于过程比较复杂,用图给你说明一下吧,对于静态代码块什么时候执行,不是重点,所以不深入研究

相关解决方案

最新解决方案