Person 里面有两个属性String name
和int age
. 浅拷贝后的对象修改了 name 为什么不影响原先对象的 name?
Person p = new Person(23, "zhang"); System.out.println(p); Person p1 = (Person p.clone(); System.out.println(p.getName()==p1.getName()); p1.setName="lisi" System.out.println(p); System.out.println(p.getName()==p1.getName());
p[name=zhangsan, age=23] true p[name=zhangsan, age=23] false
![]() | 1 HelloAmadeus 2019-07-25 12:23:40 +08:00 via iPhone string 是不可变对象 |
![]() | 2 lhx2008 2019-07-25 12:28:22 +08:00 via Android 第二个就不说了,肯定不等 第一个是 string pool 的原因,你初始化的时候用了 string pool |
3 ninjachen 2019-07-25 12:40:34 +08:00 ![]() p1.setName("lisi"); 执行了这个后,p1 的 name 的引用变了,string 是不可变对象,你可以认为是 p1.name = new String(lisi"); |
![]() | 4 passerbytiny 2019-07-25 13:03:48 +08:00 ![]() |
5 danjk159 2019-07-25 14:50:32 +08:00 后面设置值的时候已经把 p1 的 String 指针位置变了,但是并不影响 p 的 String 指针位置,所以 p 的数值没影响,虽然 java 没实际使用指针.但是机制上理解还是这样子说更合适,说错误怪 |
![]() | 6 wysnylc 2019-07-25 16:06:24 +08:00 基本类型和基本类型的封装类型不使用对象的传递性质 |
![]() | 7 qwerthhusn 2019-07-25 16:24:20 +08:00 你应该看看马士兵的基础视频 |
![]() | 8 palmers 2019-07-25 18:17:23 +08:00 Person p1 = (Person) p.clone(); 虽然是浅拷贝但是 p1 是一个新引用,p1.setName="lisi" 只是改变了 p1 这个引用的 name 指向 并没有改变 p.name 的指向 你可能对指针这块不太熟悉, 你可以试试 画画内存图 就会非常清晰了 |
![]() | 9 serical 2019-07-25 18:19:48 +08:00 via Android 跟你重写 clone 方法有关,默认就是浅复制 |
![]() | 10 palmers 2019-07-25 18:21:43 +08:00 通俗一点理解就是: p1.setName="lisi" 这句的含义就是 p1 的 name 属性指针从指向 "zhang" 改变指向 "lisi" , 不再指向"zhang", 所以 你看这期间对 p 对象没有一点点影响. 还有 p1.setName="lisi" 这句代码是不是你粘贴错了? 应该是 p1.setName("lisi") 或者 p1.name = "lisi" 才对 |
![]() | 11 mmdsun 2019-07-25 23:55:51 +08:00 via Android 你把 p1 也输出来就知道了 |