求问一个关于代码在内存的执行情况的有关问题
求问一个关于代码在内存的执行情况的问题
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,发现的确是这样
上面这个带参的构造方法在被调用时,传入的参数就是”带参构造方法在执行a=10“,但是在进入该方法之后执行“System.out.println(n);”之前,程序又去执行了
此时控制台打印出“非静态代码块在执行a=8”
然后程序继续执行
中的 Sytem.out.println(n);所以控制台输出“带参构造方法在执行a=10”,但其实此时 a 的值已经是 8 了
你可以看下我下面稍稍改动后的代码以及运行结果
这个涉及到初始化的优先级,其实我也不太清楚各种初始化方式的之间的优先级,还是用了编译器的debug来获知它们的执行顺序的。。。。看来得补补这方面的知识了~~~
------解决思路----------------------
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来获知它们的执行顺序的。。。。看来得补补这方面的知识了~~~
------解决思路----------------------
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();
}
}