以下是有关Thinking In JAVA的一段代码。
其中红色部分不知为何?为何调用另一个有参数的构造方法时又打印出a=10?不是已经在非静态的块中赋值为8了吗?
请看代码及测试结果分析:
public class TestStaticCon {
static int a=0;
static {
a=10;
System.out.println("静态程序块中A="+a);
}
{
a=8;
System.out.println("非静态程序块中A="+a);
}
public TestStaticCon(){
this("a 带参构造方法中的值: " + a);
// 调用另外一 个构造方法
System.out .println( a);
System. out .println(" 无参构造方法在执行 a=" + a);
}
public TestStaticCon(String str) {
System. out .println(str);
System.out .println(a);
}
public static void main(String args[]){
System.out.println("开始测试");
TestStaticCon test = null ;
System.out.println("声明结束");
test =new TestStaticCon();
}}
测试结果:
静态程序块中A=10
开始测试
声明结束
非静态程序块中A=8
a 带参构造方法中的值: 10
8
8
无参构造方法在执行 a=8代码分析
其中红色部分不知为何?为何调用另一个有参数的构造方法时又打印出a=10?不是已经在非静态的块中赋值为8了吗?
请看代码及测试结果分析:
public class TestStaticCon {
static int a=0;
static {
a=10;
System.out.println("静态程序块中A="+a);
}
{
a=8;
System.out.println("非静态程序块中A="+a);
}
public TestStaticCon(){
this("a 带参构造方法中的值: " + a);
// 调用另外一 个构造方法
System.out .println( a);
System. out .println(" 无参构造方法在执行 a=" + a);
}
public TestStaticCon(String str) {
System. out .println(str);
System.out .println(a);
}
public static void main(String args[]){
System.out.println("开始测试");
TestStaticCon test = null ;
System.out.println("声明结束");
test =new TestStaticCon();
}}
测试结果:
静态程序块中A=10
开始测试
声明结束
非静态程序块中A=8
a 带参构造方法中的值: 10
8
8
无参构造方法在执行 a=8代码分析
解决方案 »
- jdbc查询数据库 如何得到树结构的数据呢
- 请教个问题。在svn上现在的ofbiz工程。在eclipse下运行build.xml文件报错,是什么原因啊。怎么修改啊
- 对于当前线程的几点疑惑(生产者消费者)
- struts2,返回json数据类型
- spring2.5.6+hibernate3.3.1启动tomcat错误
- java servlet新人问题 求助
- URLConnection传送图片时,出了点问题,好象是编码的问题。
- 关于 Java开发利器:Hibernate开发及整合应用大全的问题
- weblogic中 -ms64m -mx128m是什么意思?
- 求解决
- java中获得手机验证与绑定怎么做
- Saba系统
这里看到的答案做个搬运工吧,还有很多东西要学啊
======================【非原创】======================================
实际的执行过程是这样的..
首先,static { ... },这时候a的值是10
其次,默认构造器TestStaticCon(),首先为this(String)准备参数,参数就是"..." + a,这时候a的值是10,注意默认构造器尚未执行完
再次,调用有参构造器,在有参构造器中首先之行的是初始化,也就是{ a = 8 }这部分,尽管这与大多数家伙的认识不符,但事实就是这样
最后,完成默认构造器调用..因为我是看的javap -verbose,所以有作弊之嫌!
=============================================================