这是代码本身
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));
}
就像我说的那样,您选择要做的一个取决于您,我个人更喜欢最后两个,但这就是我。