class Person implements Cloneable{
private String name;
private Car car;
Person(String s,String t){
name=s;
car=new Car(t);
} public Car getCar(){
return car;
}
public String getName(){
return name;
}
public void setName(String s){
name=s;
}
public Object clone(){
try{
return super.clone();
}catch(CloneNotSupportedException e){
return null;
}
}
}
//-------------------------------------
class Car{
private String name;
public Car(String s){
name=s;
}
public String getName(){
return name;
}
public void setName(String s){
name=s;
}
}
//-----------------------------
public class Test{
public static void main(String [] args){
Person p=new Person("PersonA","car1");
Person q=(Person)p.clone();
q.setName("PersonB");
q.getCar().setName("car2");
System.out.println(p.getName()+";"+p.getCar().getName());
}
}
// 这是java设计模式原型中的一段代码,还是不明白结果为何是这样。请高手指点
private String name;
private Car car;
Person(String s,String t){
name=s;
car=new Car(t);
} public Car getCar(){
return car;
}
public String getName(){
return name;
}
public void setName(String s){
name=s;
}
public Object clone(){
try{
return super.clone();
}catch(CloneNotSupportedException e){
return null;
}
}
}
//-------------------------------------
class Car{
private String name;
public Car(String s){
name=s;
}
public String getName(){
return name;
}
public void setName(String s){
name=s;
}
}
//-----------------------------
public class Test{
public static void main(String [] args){
Person p=new Person("PersonA","car1");
Person q=(Person)p.clone();
q.setName("PersonB");
q.getCar().setName("car2");
System.out.println(p.getName()+";"+p.getCar().getName());
}
}
// 这是java设计模式原型中的一段代码,还是不明白结果为何是这样。请高手指点
解决方案 »
- 代码检查工具
- 救命吖,(JavaMail问题)javax.mail.internet.ParseException: Unbalanced quoted string
- 象MSN那样弹出的非IE窗口中有网页,JAVA中怎么在JFRAME中嵌入网页
- 请问有没有办法把一个Label上的文字横过来显示
- IBM的一道面试题,有兴趣的来作作看
- 简单的问题,求解!!!
- 照足TOMCAT指示去做,但还是连不上MYSQL,怎么办??
- 用JDBC操作oracle数据库,回滚无效,欲哭无泪中...帮帮忙
- 我在局域网中无法使用flashget,无法登陆联众游戏平台,在线求助,高分奉送!!!!
- 请问哪里jb6下载?
- Java Applet程序里可以放Flash文件吗?
- java连接sql2005 express中的问题
p
-------------
| name ---|-------> "Person1" -----------
| car ---|---------------------->| name ---|------->"car1"
------------- ------------ 复制之后的内存结构是这样的
p
-------------
| name ---|-> "Person1" -----------
| car ---|/--------------------->| name ---|------->"car1"
------------/ / ------------
/ /
q / /
---------/--- /
| name / | /
| car ---|----------------/
-------------
也就是说, 签复制之后, 虽然生成了一个新的对象, 但是里面的name和car还都是指向原来的String和Car对象的
所以, 在你操作q的时候, 对原来的p对象是有影响的,
当你q.setName的时候, 由于String是final的, 无法修改他的值, 因此会在内存中创建一个新的String, 所以p的name没有变化
但是q.getCar的时候, 返回的仍然是p指向的Car对象, 所以q.getCar().setName()也修改了p引用的Car对象一般来说, 浅复制是一种危险的操作, 会对程序产生不可预测的影响, 一般方式是重载clone方法实现深度复制, 深度复制不仅仅是复制对象的引用, 也要复制引用的对象本身, 上面的例子经过深度复制之后, 内存结果应该是这样的
p
-------------
| name ---|-------> "Person1" -----------
| car ---|---------------------->| name ---|------->"car1"
------------- ------------
q
-------------
| name ---|-------> "Person1" -----------
| car ---|---------------------->| name ---|------->"car1"
------------- ------------
这样对q操作, 就不会对p有任何影响了