对象数组的索引值被前面的索引值覆盖



这对我来说是一个奇怪的情况,我刚刚开始学习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提到的。

你使用的静态变量是类级变量,所以每次你给它们赋值时它们都会被覆盖,只有最后一个值被保留。

不要将字段设置为static,让我们使用private来控制访问-

public class Student {
    private String name; // not static, and use private.
    private int marks;
    public Human(String n, int m){
        name = n;
        marks = m;
    }
    public void printProperties(){ // also should not be static.
        System.out.println("Name = " + name + " , marks = " + m);
    }
}

不要使用static,就这么简单

静态变量属于整个类。它是一个在所有对象之间共享的变量。所以当你改变这个变量时,它会改变所有对象。

namemarks定义为实例变量。换句话说,从变量声明中删除static修饰符。实例变量对于每个对象都是唯一的。每个对象都有自己的实例变量副本。

另外,将namemarks声明为private也是很好的做法。然后为这些变量创建getter和setter。这隐藏了实现。

import java.util.Scanner;
public class Student{
    private String name;
    private int marks;
    public String getName() {  //getter
        return name;
    }
    public void setName(String name) {  //setter
        this.name = name;
    }
    public int getMarks() {  //getter
        return marks;
    }
    public void setMarks(int marks) {  //setter
        this.marks = marks;
    }
    public Student(String n, int m){
        name = n;
        marks = m;
    }
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        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].getName() + ", Marks: " + stu[x].getMarks());
        }
        scan.close();
    }

}

最新更新