对我来说这是一种奇怪的情况,我刚刚开始学习Java OOP。

我做了一个这样的班级

public class Student {
        public static String name;
        public static int marks;

        public Student(String n, int m){
            name = n;
            marks = m;
        }
        public static void printProperties(){
            System.out.println("Name = " + name + " , marks = " + m);
        }
    }


如您所见,构造函数接受两个数据:名称和标记。

在我的主要方法中

      System.out.println("Please enter number of students:");
            int n = scan.nextInt();

            Student[] stu = new Student[n];

            String name;
            int marks = 0;

            for(int i = 0; i < stu.length; i++){

                System.out.println("Please enter name for student #" + (i+1));
                name = scan.next();

                System.out.println("Please enter marks for student #" + (i+1));
                marks  = scan.nextInt();

                stu[i] = new Student(name,marks);

                System.out.println();
            }

//Display
            for(int x = 0; x < stu.length; x++){
                System.out.println("#" + (x+1) + " Name: " + stu[x].name + ", Marks: " + stu[x].marks);

            }


所以我的输出如下:

Please enter number of students:
2
Please enter name for student #1
tom
Please enter age for student #1
20

Please enter name for student #2
billy
Please enter age for student #2
80

#1 Name: billy, Marks: 80
#2 Name: billy, Marks: 80


它应该是:

   #1 Name: tom, Marks: 20
   #2 Name: billy, Marks: 80


为什么先前的索引值会覆盖其先前的索引值?

最佳答案

如果您的Student类看起来像这样,则您的代码应该可以正常工作:

public class Student{
    String name;
    int marks;
    public Student(String name, int marks){
        this.name = name;
        this.marks = marks;
    }
}


编辑:

这就是乔恩·斯基特(Jon Skeet)提到的。

您正在使用静态变量,这些静态变量是类级别的变量,因此每次将值分配给它们时,它们都会被覆盖,并且仅保留最后一个值。

您在这里需要实例变量。

10-07 19:09