java程序的不寻常行为

时间:2013-08-24 14:18:31

标签: java

我是Java的新手,并试图学习它。我写了两个类如下,我希望打印为1,2,3,但它打印3,3,3。我读了一本关于我无法弄清楚上述行为的java书,并打印1,2,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();
    }
}

有人可以帮忙吗?

6 个答案:

答案 0 :(得分:6)

indexNumber是静态的,因此它在类的每个实例之间“共享”。

如果您想要一个唯一的递增ID,请执行以下操作:

static int nextID = 1;
int indexNumber;

Student() {
    indexNumber = (nextID++);
}

这会使indexNumber成为一个实例字段,以便每个Student获得自己的副本。静态变量用于跟踪要分配的下一个ID。

答案 1 :(得分:2)

您得到3,3,3,因为您已将变量indexNumber定义为static。因此,在实例化三个学生对象时,indexNumber的值为3。 要增加将indexNumber定义为实例变量,并将其值作为参数传递。

答案 2 :(得分:2)

您的字段是静态的。它将由所有对象共享。

private static int indexNumber = 0;

s1-------->indexNumber<------s2
              ^
              |
              |
              |
              s3

每次实例化都会调用构造函数,这会使indexNumber增加1。

答案 3 :(得分:2)

indexNumber被声明为static,并且对所有对象都是通用的。因此你有3,3,3

静态成员与类相关联,而不是与任何对象相关联。

答案 4 :(得分:0)

静态成员与所有对象共享。你没有编入索引,你计算了你的测试。

答案 5 :(得分:0)

由于您已将INDEX NUMBER声明为静态,因此它将由您为该类创建的每个实例共享。如果删除static关键字,则会出现您期望的答案。这就是为什么对于所有三个对象,您获得索引号的相同值。我希望你现在很清楚。谢谢。