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 #1this() java

解决方案 »

  1.   

    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分析的整个代码执行流程,这个问题迎刃而解。