[英]Unusual behavior of java program
我是Java的新手,正在尝试学习它。 我写了两个类,如下所示,我希望将其打印为1、2、3,但其输出为3、3、3。
public class Student{
private static int indexNumber = 0;
Student(){
indexNumber=indexNumber+1;
}
public void test() {
System.out.println(this.getIndexNumber());
}
public int getIndexNumber(){
return indexNumber;
}
}
public class College {
public static void main(String args[]){
Student student1 = new Student();
Student student2 = new Student();
Student student3 = new Student();
student1.test();
student2.test();
student3.test();
}
}
有人可以帮忙吗?
indexNumber
是静态的,因此在类的每个实例之间“共享”。
如果需要唯一的递增ID,请执行以下操作:
static int nextID = 1;
int indexNumber;
Student() {
indexNumber = (nextID++);
}
这使indexNumber
成为一个实例字段,以便每个Student
获得自己的副本。 静态变量用于跟踪要分配的下一个ID。
您得到3,3,3,因为您已将变量indexNumber定义为静态。 因此,当实例化三个学生对象时,indexNumber将获得值3。要递增,请将indexNumber定义为实例变量,并将其值作为参数传递。
您的字段是静态的,它将被所有对象共享。
private static int indexNumber = 0;
s1-------->indexNumber<------s2
^
|
|
|
s3
每次实例化时,都会调用构造函数,这会使indexNumber增加1。
indexNumber
被声明为static
并且对所有对象都是公共的。 因此,您得到3,3,3
静态成员与类关联,而不与任何对象关联。
静态成员与所有对象共享。 您没有索引,您的测试算在内。
由于您已将INDEX NUMBER声明为静态,因此,您为该类创建的每个实例都将共享它。 如果您删除了static关键字,将会得到您期望的答案。 这就是为什么对于所有三个对象,您获得相同的索引号值的原因。 我希望你现在很清楚。 谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.