这个问题在这里已经有答案了:
java是“按引用传递”还是“按值传递”(84个答案)
如何制作对象的深度副本(20个答案)
21天前关门了。
我是java新手,遇到了一个无法解决的问题,也许有人能帮我解决。当我写这段代码时:
ArrayList<String> Liste = new ArrayList<>();
String Name;
Liste.add("Harry");
Name = Liste.get(0);
Name = "Dieter";
System.out.print(Liste.get(0));
System.out.print(Name);
输出如预期的那样:
Harry
Dieter
但是,如果将类型更改为自定义对象:
ArrayList<Names_Class> Liste = new ArrayList<>();
Names_Class Name;
Liste.add(new Names_Class());
Liste.get(0).First_Name = "Harry";
Name = Liste.get(0);
Name.First_Name = "Dieter";
System.out.print(Liste.get(0));
System.out.print(Name);
输出变为:
Dieter
Dieter
所以java似乎只复制了一个引用之类的东西。有人能解释一下这里发生了什么,以及我如何从arraylist中获得一个项目的完整副本吗?
1条答案
按热度按时间ee7vknir1#
字符串类型存储在堆栈中。对象类型存储在堆中。
您在堆栈的某个位置添加了一个字符串值“harry”。
然后你给它起了个参考名“name”
您在堆栈中的某个位置创建了一个新值“dieter”。
“name”现在引用存储“dieter”的堆栈位置。
liste.get(0)个引用“harry”。
“name”引用“dieter”
与此同时,
新名称\u class()在堆中为名称\u class()指定一些内存空间
liste的第一个对象-名字引用“harry”
“name”引用了liste.get(0)正在引用的内容。
“name”-first\u name引用“dieter”这与liste.get(0)相同。first\u name=“dieter”。
它们都打印相同的值,因为name引用的位置与liste.get(0)相同