2013-08-24 59 views
1

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

任何人都可以帮忙吗?

+0

这将是非常有益的。 –

回答

2

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

6

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

如果你想要一个独特的,递增的ID,请执行以下操作:

static int nextID = 1; 
int indexNumber; 

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

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

2

您的字段是static.It将被所有对象共享。

private static int indexNumber = 0; 

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

每次实例化,构造函数被调用,它递增1

2

indexNumber的indexNumber被声明为static和通用于所有对象。因此你得到3,3,3

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

0

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

0

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