2015-03-02 31 views
1

下面说的是我的bean类:什么是输出和为什么ArrayList /任何集合的行为是这样的?

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

我的问题是:

  1. 据我所知Java是pass-by-value或者说 pass-by-copy-of-the-variable-value然后就 employee对象的副本被保存在ArrayList中或引用它作为增加ArrayList后的对象值得到改变 到Last name员工的 原来的对象?
  2. 每个收藏品都是这样吗?
+2

当一个基元被传递给一个函数时,它是通过值传递的,当一个对象被传递给一个函数时,对该对象的引用是按值传递的。 – 2015-03-02 10:49:48

回答

4

employee参考副本被保存在ArrayList,但由于它是指同一Employee例如,经由employee参考稍后更改实例影响存储在ArrayList的元素。

是的,每个Collection的行为都是这样的,因为Collection不会创建传递给它们的实例的副本,它们只是存储对这些实例的引用。

2
  1. 据我所知Java是通过按值或者说传递通过拷贝的最值变量值,那么就员工 对象的副本被保存在ArrayList中也引用原始对象 作为对象值被更改为 添加到ArrayList后的姓氏?

参考将通过按值。所以,会有2个引用指向同一个Employee实例。一个参考文献是employee,另一个参考文献是arraylist

  1. 每个收藏都是这样吗?

是的。其实,这是不是属性的集合。这是java设计的方式。全部可变引用类型以这种方式表现。

0

局部变量employee和列表的第一个元素是两个不同引用同一对象。这就是为什么修改其中一个参考对象(例如通过setName)将通过另一个可见的原因。

但是,如果您通过分配不同的引用来替换引用,那么将不会影响

例如为:

employee = new Employee(); 
employee.setName("Vishrant"); 

现在employee和列表参考不同对象的第一个元素,所以在阵列中的元件将不被调用"Vishrant"