1

我是 Java 新手,正在努力学习它。我写了两个类如下,我希望打印为 1、2、3,但它打印 3、3、3。我读了一本关于我无法弄清楚上述行为并打印 1、2、3 的 java 书。

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();
    }
}

任何人都可以帮忙吗?

4

6 回答 6

6

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

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

static int nextID = 1;
int indexNumber;

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

这会创建indexNumber一个实例字段,以便每个字段Student都有自己的副本。静态变量用于跟踪要分配的下一个 ID。

于 2013-08-24T14:20:59.110 回答
2

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

于 2013-08-24T14:20:58.640 回答
2

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

private static int indexNumber = 0;

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

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

于 2013-08-24T14:21:01.423 回答
2

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

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

于 2013-08-24T14:21:31.300 回答
0

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

于 2013-08-24T14:32:46.613 回答
0

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

于 2013-08-24T15:19:19.490 回答