这是代码本身
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进行静态引用”
答案 0 :(得分:6)
您正尝试在可执行上下文之外执行代码。代码只能从方法,静态初始化程序或实例初始化程序(Thanks 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));
}
正如我所说,你选择做哪一个会归结为你,我个人更喜欢最后两个,但那就是我。
答案 1 :(得分:1)
这是因为您正在non static field
内访问static function
。
在你的情况下。
ArrayList<Student> rayList = new ArrayList<Student>(); // declare instance variable.
并且您无法访问实例变量而无需创建类的实例。
改为使用,
public static void main(String[] args) {
ArrayList<Student> rayList = new ArrayList<Student>(); // creates local instance of rayList
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));
}
答案 2 :(得分:1)
该错误表示rayList
不是静态的(换句话说,它是类Student
的成员),但您的main
方法是:
/** THIS IS NOT STATIC **/
ArrayList<Student> rayList = new ArrayList<Student>();
...
public static void main(String[] args) {
/** THIS SCOPE IS STATIC **/
System.out.println(rayList.get(0));
}
你实际上无法列出Student
作为Student
成员的列表,因为你会得到一个堆栈溢出或内存不足,这取决于你创建它的方式,所以我猜猜你希望rayList
是静态的。这会使rayList
不再是Student
的成员。
您也无法以初始化程序块或方法之外的方式添加ArrayList
。
有关初始化程序块的更多信息,请参阅此处:
或者您可以在rayList
方法中移动所有引用main
的内容。
答案 3 :(得分:0)
将rayList
变量设为静态,以便在main
方法中使用它,如下所示:
然后在main方法中添加对象并使用它:
static ArrayList<Student> rayList = new ArrayList<Student>();
public static void main(String[] arg){
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));
//Do whatever you want.
}