v******y 发帖数: 84 | 1 定义一个class Employee, 里面的id 是static按class建立的顺序分配的
就是static nextId 初始化为1
在initiation block中赋值id,
{
id=nextId;
++nextId;
}
测试的时候,第一个用constructor Employee(n, s),id=1,nextId=2
第二个用Employee(s)
然后用this("Employee #"+nextId,s)调用Employee(n,s)
这是我的问题,这个时候initiaion block
{
id=nextId;
++nextId;
}
已经运行了,id=2, nextId 是3了,为啥在这个
this("Employee #"+nextId,s)中的nextId 还是2呢?
public class Employee{
private String name="";
private double salary;
private int id;
private static int nextId=1;
{
id=nextId;
++nextId;
}
public Employee(String n, double s){
name=n;
salary=s;
}
public Employee(double s){
this("Employee #"+nextId,s);
}
public Employee(){
this(0);
}
public static void main(String [] args){
Employee[] staff=new Employee[3];
staff[0]=new Employee("Lee",10000);
staff[1]=new Employee(5000);
staff[2]=new Employee();
}
} | g*****g 发帖数: 34805 | 2 static block is only ran once, when the class is being loaded, it doesn't
matter how many instances you have. | v******y 发帖数: 84 | 3 这个是no static block,每次都会run的
比如第三个object是,id=3, nextId=4了
【在 g*****g 的大作中提到】 : static block is only ran once, when the class is being loaded, it doesn't : matter how many instances you have.
| s****y 发帖数: 503 | 4 no static block每次创建instance都执行,而且比constructor早执行 | v******y 发帖数: 84 | 5 我就是这个意思
但是你看看
第二个instance时
non static block已经运行了,这时分配到第二个instance 的id=2, static nextId=3了
但是在第二个instance的constructor 中的this(nextId)的 nextId还是2
这是我不明白的地方
【在 s****y 的大作中提到】 : no static block每次创建instance都执行,而且比constructor早执行
| g*****g 发帖数: 34805 | 6 I think you are referencing the same static variable in multiple instances.
You probably hit threading issue.
Try AtomicInteger instead.
=3了
【在 v******y 的大作中提到】 : 我就是这个意思 : 但是你看看 : 第二个instance时 : non static block已经运行了,这时分配到第二个instance 的id=2, static nextId=3了 : 但是在第二个instance的constructor 中的this(nextId)的 nextId还是2 : 这是我不明白的地方
| v******y 发帖数: 84 | 7 我想这个是设计成这样的,一直搞不清原理
用AtomicInteger也是一样的结果,当前constructor 用this(static nextId) 是用
cached着上一个 instance的value,不是现在instance的value. 但是如果用其他method
,像Sytem.out.println(nextId)就是当前instance 的nextId.
.
【在 g*****g 的大作中提到】 : I think you are referencing the same static variable in multiple instances. : You probably hit threading issue. : Try AtomicInteger instead. : : =3了
| w***x 发帖数: 105 | 8 这个构造函数 :
public Employee(double s){
this("Employee #"+nextId,s);
}
由于调用了另外一个构造函数,所以它被调用的时候,初始化部分代码不会触发,而是
在这个最终干净的构造函数之前触发:
public Employee(String n, double s){
name=n;
salary=s;
} |
|