这是代码本身

import java.util.ArrayList;

public class Student {
    private String name;
    private int age;

    public Student (String n, int a) {
        name = n;
        age = a;

    }

    public String toString() {
        return name + " is " + age + " years old";
    }

    ArrayList<Student> rayList = new ArrayList<Student>();
    rayList.add(new Student("Sam", 17));
    rayList.add(new Student("Sandra", 18));
    rayList.add(new Student("Billy", 16));
    rayList.add(new Student("Greg", 17));
    rayList.add(new Student("Jill", 18));

    public static void main(String[] args) {
        System.out.println(rayList.get(0));
    }

}


main方法中缺少某些println命令。
但是,当我尝试将5个学生添加到ArrayList时,出现错误“无法对非静态字段rayList进行静态引用”

最佳答案

您正在尝试在可执行上下文之外执行代码。只能从方法,静态初始化程序或实例初始化程序(感谢NickC)上下文中执行代码。

尝试将其移到main方法中以开始...

public static void main(String[] args) {
    ArrayList<Student> rayList = new ArrayList<Student>();
    rayList.add(new Student("Sam", 17));
    rayList.add(new Student("Sandra", 18));
    rayList.add(new Student("Billy", 16));
    rayList.add(new Student("Greg", 17));
    rayList.add(new Student("Jill", 18));
    System.out.println(rayList.get(0));
}


根据反馈进行了更新

由于未将Cannot make a static reference to the non-static field rayList声明为rayList,因此生成了您的第一个错误static,但是您试图从static上下文引用它。

// Not static
ArrayList<Student> rayList = new ArrayList<Student>();
// Is static
public static void main(String[] args) {
    // Can not be resolved.
    System.out.println(rayList.get(0));
}


rayList被声明为“实例”字段/变量,这意味着它在具有含义之前需要声明类(Student)的实例。

这可以通过...解决

例如,在Student中创建main的实例并通过该实例访问它。

public static void main(String[] args) {
    Student student = new Student(...);
    //...
    System.out.println(student.rayList.get(0));
}


我个人不喜欢这样,rayList并不真正属于Student,它没有任何价值。您能想象在将任何内容添加到Student之前必须创建List实例吗?

我也不喜欢直接访问实例字段,但这是个人喜好。

制作rayList static

static ArrayList<Student> rayList = new ArrayList<Student>();
// Is static
public static void main(String[] args) {
    //...
    System.out.println(rayList.get(0));
}


这是一个可行的选择,但是在被认为是好是坏之前,需要更多的上下文。我个人认为static字段会导致超出其解决范围的问题,但这再次是个人观点,您的上下文可能认为是合理的解决方案。

或者,您可以在List方法的上下文中创建static的本地实例,如第一个示例所示。

public static void main(String[] args) {
    ArrayList<Student> rayList = new ArrayList<Student>();
    //...
    System.out.println(rayList.get(0));
}


就像我说的那样,您选择要做的一个取决于您,我个人更喜欢最后两个,但这就是我。

08-28 18:24