我的ArrayList无法识别我添加到列表中的内容

时间:2013-09-27 06:48:46

标签: java arraylist

这是代码本身

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 个答案:

答案 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.
}