下面说的是我的bean类:
public class Employee {
private String name = null;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这是我的主要课程:
import java.util.ArrayList;
public class MainClass {
public static void main(String[] args) {
Employee employee = new Employee();
employee.setName("First name");
ArrayList<Employee> empList = new ArrayList<Employee>();
empList.add(employee);
employee.setName("Last name");
for (Employee emp : empList) {
System.out.println(emp.getName());
}
}
}
当我执行输出时:Last name
我的问题是:
employee
对象保存在ArrayList中,或者它引用了
Employee的原始对象随着对象值的变化而变化
添加到Last name
后<{1}} 答案 0 :(得分:4)
employee
引用的副本已保存在ArrayList
中,但由于它引用了相同的Employee
实例,因此稍后通过employee
引用更改实例会影响存储在ArrayList
。
是的,每个Collection
的行为都是这样的,因为Collection
不会创建传递给它们的实例的副本,它们只存储对这些实例的引用。
答案 1 :(得分:2)
- 据我所知,Java是按价值传递,或者更确切地说是变量值的副本,然后是员工的副本 对象保存在ArrayList中,或者引用原始对象 Employee作为对象值后更改为姓氏 添加到ArrayList?
醇>
引用将是按值传递。因此,将有2个引用指向同一个Employee实例。一个引用为employee
,另一个引用位于arraylist
。
- 每个Collection都是这样的吗?
醇>
是。实际上,这是 NOT 集合的属性。这是java的设计方式。所有可变引用类型都以这种方式运行。
答案 2 :(得分:0)
本地变量employee
和列表的第一个元素是对同一个对象的两个不同引用。这就是为什么修改引用的对象(例如,通过setName
),其中一个将通过另一个可见。
但是,如果您通过指定其他参考来替换参考,则 >>不会影响另一参考。
E.g:
employee = new Employee();
employee.setName("Vishrant");
现在employee
并且列表的第一个元素引用了不同的对象,因此数组中的元素将不会被称为"Vishrant"
。