求问一个关于代码在内存的执行情况的有关问题

求问一个关于代码在内存的执行情况的问题
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 tsc = null;
        System.out.println("----------------");
        tsc = new Test();
    }
}
---------------------------------------------------------
运行结果:
静态代码块在执行a=10
----------------
非静态代码块在执行a=8
带参构造方法在执行a=10
无参构造方法在执行a=8

我想问为什么带参构造方法这里a是等于10,然后后面又为什么是8,明明也只声明了一个变量
------解决思路----------------------
把所有代码都加了断点然后进行debug,发现的确是这样

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

上面这个带参的构造方法在被调用时,传入的参数就是”带参构造方法在执行a=10“,但是在进入该方法之后执行“System.out.println(n);”之前,程序又去执行了
 
   {
        a = 8;
        System.out.println("非静态代码块在执行a="+ a);
    }

此时控制台打印出“非静态代码块在执行a=8”
然后程序继续执行

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

中的 Sytem.out.println(n);所以控制台输出“带参构造方法在执行a=10”,但其实此时 a 的值已经是 8 了
你可以看下我下面稍稍改动后的代码以及运行结果
求问一个关于代码在内存的执行情况的有关问题
这个涉及到初始化的优先级,其实我也不太清楚各种初始化方式的之间的优先级,还是用了编译器的debug来获知它们的执行顺序的。。。。看来得补补这方面的知识了~~~
引用:
Quote: 引用:

带参构造函数输出的是字符串n的值,这个值传进来的时候是:”带参构造方法在执行a=10“,这时不代表a的值是10. 楼主可以在有参构造函数里加一句输出a看看。因为初始化块先于构造函数内语句的执行,所以就会是那样的结果。

public Test(String n) {
        System.out.println("Now a is " + a);//加这句
        System.out.println(n);
    }

楼主可参考以下:
http://blog.csdn.net/avinegar/article/details/7749431
http://wenwen.sogou.com/z/q191435823.htm

我还是没搞明白,new出对象的时候应该首先执行非静态代码块,这时候a的值就是8了,怎么还会是打印出10来,而这个10又是从哪里来的

------解决思路----------------------

public class Test2 {
public static int a = 0;
    static{
        a = 10;
        System.out.println("静态代码块在执行a="+ a);
    }
    public Test2(){
        this("带参构造方法在执行a="+ a);
        System.out.println("无参构造方法在执行a="+ a);
    }
    public Test2(String n) {
     a = 8;
        System.out.println("非静态代码块在执行a="+ a);
        System.out.println(n);
    }
    public static void main(String[] args) {
     Test2 tsc = null;
        System.out.println("----------------");
        tsc = new Test2();
    }
}

求问一个关于代码在内存的执行情况的有关问题