静态变量在Java中通过引用传递

时间:2015-05-25 19:18:14

标签: java variables global-variables pass-by-reference

我在A组中有以下内容:

initWithObject

我在B级有以下内容:

static ArrayList<Student> students;

在调试模式下,我看到方法中public static void populate_students(ArrayList<Student> students) { students = new ArrayList<Student>(); // ... } 被初始化(非空)但返回到A类后,student为null。为什么会这样?我认为在Java中随处可见对对象所做的更改。

3 个答案:

答案 0 :(得分:2)

如果将静态students变量传递给populate_students,该方法可以更改该变量引用的实例的状态,但是它不能为该变量分配新值。因此,如果将null传递给方法,则在方法返回后,静态变量将保持为null

相反,您需要从方法中返回List

public static ArrayList<Student> populate_students() {
    ArrayList<Student> students = new ArrayList<Student>();
// ...
    return students;
}

并将其分配给静态变量:

static ArrayList<Student> students = B.populate_students();

答案 1 :(得分:2)

Java不是pass-by-ref,它是pass-by-val(差不多)。

如果直接修改students参数而不更改引用,则修改后的值将变为原始引用。

例如,Collections.sort(students..)将对列表进行排序,而不必从返回中捕获它。

但是在您的示例中,您重新为students分配了一个新列表,因此您方法中的新students列表不再与旧列表相关联。

我相信你真正想做的是

A.students = new ArrayList<Student>();

答案 2 :(得分:2)

Java中没有pass-by-reference:原语和引用按值传递。您无法通过分配来更改传递给方法的引用。如果您在students中看到populate_students设置为非空值,那是因为调试器已从上下文中找出students的新含义,并显示了方法的参数{{ {1}}给你。

如果您想在一个方法中生成一个列表并将其设置为一个类中的变量,您可以这样做:

students