0

这是代码本身

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 进行静态引用”

4

4 回答 4

6

您正在尝试在可执行上下文之外执行代码。代码只能从方法、静态初始化程序或实例初始化程序(感谢 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) 的实例才能有意义。

这可以通过...解决

创建Studentin的实例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));
}

正如我所说,你选择做哪一个将取决于你,我个人更喜欢最后两个,但那就是我。

于 2013-09-27T06:50:45.457 回答
1

该错误意味着它rayList不是静态的(换句话说,它是 class 的成员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));
}

实际上,您无法将Students 列表作为成员,Student因为您将获得堆栈溢出或内存不足,具体取决于您创建它的方式,所以我猜您想要rayList是静态的。那将rayList不再是 的成员Student

您也不能添加到您ArrayList在初始化程序块或方法之外的方式。

有关初始化程序块的更多信息,请参见此处:

rayList或者,您可以移动main方法中引用的所有内容。

于 2013-09-27T06:51:42.177 回答
1

这是因为您正在访问non static fieldinside 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));
}
于 2013-09-27T06:50:13.570 回答
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.
}
于 2013-09-27T06:51:20.800 回答