日期:2014-05-20  浏览次数:20741 次

执行了构造代码块,为什么在构造函数中使用this语句时,静态变量的值没有改变,还是原来的1
public class FouthDemo {
public static void main(String[] args) {
Tiger t = new Tiger();
System.out.println(t.getName());
}
}

class Tiger {
private static int nextId = 0;
private String name;
{
nextId++;
}
public Tiger(String name) {
this.name = name;
}
public Tiger() {
// this("Tiger #"+nextId); //1,使用这句打印Tiger #0
this.name = "Tiger #" + nextId; //2, 使用这句则打印Tiger #1
}
public String getName() {
return this.name;
}
}
// 问题是:为什么使用this("Tiger #"+nextId)时打印结果为Tiger #0 ,而使用this.name = "Tiger #"+nextId时,打印结果为Tiger #1
this()? java

------解决方案--------------------
1、this("Tiger #"+nextId)打印Tiger #0的原因:
main函数在创建对象Tiger t = new Tiger();时,此时调用Tiger()构造函数,先在栈内存中创建了String name
内存,值为Tiger #0,此后才执行实例块{nextId++;},再执行构造函数Tiger(String name)方法体,最后执行Tiger()方法体后面的语句

将我改造后的代码说明如下:(可debug一下,整个执行过程就清楚了)

package com.zl.base;

class Tiger {
private static int nextId = 0;
private String name;
private static String username;

{ //实例块:在构造方法执行前执行
nextId++;
System.out.println("InstanceBlock execute!");
System.out.println("InstanceBlock: " + nextId);
}

static { //在类被加载到内存时执行,在main方法前执行
username = "Zhanglu";
System.out.println("Username: " + username);
}

public Tiger(String name) { 
this.name = name;  
System.out.println("New execute!");
System.out.println("New: " + nextId);
}

public Tiger() {
this("Tiger #"+nextId); ////在栈内存中name先被创建,而后执行实例块中的代码,所以打印的name值为:Tiger #0
System.out.println("TigerNew: " + nextId);
//this.name = "Tiger #" + nextId; //2, 使用这句则打印Tiger #1
}

public String getName() {
return this.name;
}
}



2.this.name = "Tiger #" + nextId; //2, 使用这句则打印Tiger #1的原因:
根据问题1分析的整个代码执行流程,这个问题迎刃而解。