返回信息流刚学java,看到构造函数部分,有个例子,简化之后如下,我想知道为什么this()里面的nextId不是2却是1呢?急求。。。。拜托各位大侠指教
public class ConstructorTest
{
public static void main(String[] args)
{
Employee staff = new Employee();
}
}
class Employee
{
public Employee(String n)
{
System.out.println("constructing...nextId: " + nextId);
System.out.println(n);
}
public Employee()
{
// calls the Employee(String) constructor
this("Employee #" + nextId);
}
private static int nextId = 1;
private int id;
{
id = nextId;
nextId++;
System.out.println("id: " + id + ", nextId: " + nextId);
}
}
这是一条镜像帖。来源:北邮人论坛 / java / #27539同步于 2013/10/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
菜鸟求问this调用构造函数,急求大侠指教
keyjewel
2013/10/24镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我知道啊,可是如果我把this那句换成输出nextId,就输出2,可是this的nextId参数为啥会是1……
【 在 yanxuan 的大作中提到: 】
: 构造代码块在创建对象时先于构造函数执行
不好意思,刚才没看清楚问题
【 在 keyjewel 的大作中提到: 】
: 我知道啊,可是如果我把this那句换成输出nextId,就输出2,可是this的nextId参数为啥会是1……
public class ConstructorTest
{
public static void main(String[] args)
{
1 Employee staff = new Employee();
}
}
class Employee
{
3 public Employee(String n)
{
System.out.println("constructing...nextId: " + nextId);
System.out.println(n);
}
public Employee()
{
// calls the Employee(String) constructor
2 this("Employee #" + nextId);
}
private static int nextId = 1;
private int id;
4 {
id = nextId;
nextId++;
System.out.println("id: " + id + ", nextId: " + nextId);
}
}
执行顺序为1-2-3-4,构造代码块先与构造函数执行,但是在构造代码块执行之前会执行3所在的语句,然后才执行4,所以执行3后,变量n已经生成。单步调试下会很明显。
re ls, javap 了一下,{}里的语句,会被编译到构造函数里去,例如在Employee(String)里会先做{}的东西,然后再调用System.out.println();
class Employee
{
public Employee(String n)
{
2. 由Employee()调用,n为"Employee # 1"
3. 初始化{}块,nextId=2
System.out.println("constructing...nextId: " + nextId);
System.out.println(n);
}
public Employee()
{
1. 构造,此时nextId=1;
this("Employee #" + nextId);
//如果lz这里不调用另一个构造函数,那么{}初始化的过程会放到这里。在执行其他函数之前。
}
private static int nextId = 1;
private int id;
{
id = nextId;
nextId++;
System.out.println("id: " + id + ", nextId: " + nextId);
}
}
【 在 keyjewel 的大作中提到: 】
: 刚学java,看到构造函数部分,有个例子,简化之后如下,我想知道为什么this()里面的nextId不是2却是1呢?急求。。。。拜托各位大侠指教
: public class ConstructorTest
: {
: ...................
用javap查看字节码这个方法不错
【 在 aiquestion 的大作中提到: 】
: re ls, javap 了一下,{}里的语句,会被编译到构造函数里去,例如在Employee(String)里会先做{}的东西,然后再调用System.out.println();