【问题标题】:Cannot understand output of following Java Program无法理解以下 Java 程序的输出
【发布时间】:2017-01-22 06:14:02
【问题描述】:

我是 Java 新手,对此代码的输出有疑问

public class Employee{
    private String name;
    private int age;
    private List<String> stationeryList;

    public Employee(String name, int age, List<String> stationeryList)
    {
      this.name= name;
      this.age = age;
      this.stationeryList = stationeryList;
    }

    // getter methods
    public String getName()
    {
       return name;
    }

    public int getAge()
    {
      return age;
    }

    public List<String> getStationeryList()
    {
        return stationeryList;
    }    

    }

    public static void main(){
    String name = "XYZ";
    int age = 34;
    List<String> list = new ArrayList<String>();
    list.add("Chair");
    Employee emp = new Employee(name, age, list);
    list.add("Desk");
    for(String str:emp.getStationeryList())
     System.out.println(str);
    }

这会同时打印椅子和办公桌,而我原本希望它只打印椅子,因为当我们创建 emp 对象列表时只有椅子。谁能解释一下这背后的原因。

【问题讨论】:

  • @yashpandey 其实Java是传值的,但是传的值是对列表的引用。
  • @yashpandey Java 不是通过引用传递的,这与问题无关。
  • @shmosel 是的,我错了,谢谢,我澄清了,它按值传递引用。
  • @ModusTollens,所以在这种情况下,emp.getStationerList 是对实际列表的引用,因此当他遍历它时,输出是椅子和桌子的实际内容,而不是什么他通过了,它只是一个参考。
  • @yashpandey 是的,这是正确的。传递的值是对现有列表的引用。

标签: java output


【解决方案1】:

您在创建 List 对象后添加...所以它将存储在 List 内存中... 使用list.index(0); 仅打印椅子

【讨论】:

    【解决方案2】:

    首先我们需要了解这里的引用变量是什么:

    List<String> list = new ArrayList<String>();
    

    这里 list 引用变量有 ArrayList 对象的引用,所以这意味着它列表总是有 ArrayList 对象的内存地址。

    每当你添加一个新元素时,它总是引用 ArrayList 对象的相同地址。

    您将 Desk 添加到 list 对象中,因此它引用相同的内存地址。

    这就是它保留我们在这里作为引用传递的对象值的原因

     Employee emp = new Employee(name, age, list);
    

    所以总而言之,这两个时间都是相同的对象,这就是它同时打印的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 2017-10-31
      • 2015-04-02
      • 2019-03-05
      相关资源
      最近更新 更多