我在A组中有以下内容:
initWithObject
我在B级有以下内容:
static ArrayList<Student> students;
在调试模式下,我看到方法中public static void populate_students(ArrayList<Student> students) {
students = new ArrayList<Student>();
// ...
}
被初始化(非空)但返回到A类后,student为null。为什么会这样?我认为在Java中随处可见对对象所做的更改。
答案 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