String a = "abc";
String b ="abc";
//反射abc
Field[] declaredFields = "abc".getClass().getDeclaredFields();
for (Field field : declaredFields) {
//修改abc的值
if (field.getName().equals("value")) {
try {
field.setAccessible(true);
//改位eeee 因为jdk1.8String 内部是Char类型
field.set(a, "eeee".toCharArray());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
System.out.println(a);
System.out.println(b);
先看这个代码 声明了两个String 值为abc ,然后把abc修改为eee 那么她的答案是多少了?
很多人一看看上去 觉得a改成eeee ,b还是 abc
正确答案都是eee 在举一个例子
List<User> list = new LinkedList<User>();
User caoCao = new User();
caoCao.setName("曹操");
list.add(caoCao);
User liuBei = list.get(0);
liuBei.setName("刘备");
System.out.println(caoCao.getName());
声明一个user 其名字为曹操,并把他添加到List集合里后,获取list集合第一个并对齐进行修改为刘备 那么他的结果是刘备还是曹操?
答案是刘备,那为什么什么刘备了,我这里并没有修改曹操的对象,这是为什么了,其实是他们的引用地址是相同的。
List<User> list = new LinkedList<User>();
User caoCao = new User();
caoCao.setName("曹操");
list.add(caoCao);
User liuBei = list.get(0);
liuBei.setName("刘备");
System.out.println(caoCao.getName());
System.out.println(liuBei);
System.out.println(caoCao);
如果要解决这个问题不让他引用对象一样那么我们需要 使用这个接口
Cloneable并重写Clone 方法也就是把protected改为public
public class User implements Cloneable{
private Long id;
private String name;
private String account;
private String password;
public Integer getAvg() {
return avg;
}
public void setAvg(Integer avg) {
this.avg = avg;
}
private String sex;
public User(){
}
public User(Long id, String name, String account, String password, String sex, Integer avg) {
this.id = id;
this.name = name;
this.account = account;
this.password = password;
this.sex = sex;
this.avg = avg;
}
private Integer avg;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(Long id, String name, String account, String password, String sex) {
this.id = id;
this.name = name;
this.account = account;
this.password = password;
this.sex = sex;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
List<User> list = new LinkedList<User>();
User caoCao = new User();
caoCao.setName("曹操");
list.add(caoCao);
User liuBei = null;
try {
liuBei = (User)list.get(0).clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
liuBei.setName("刘备");
System.out.println(liuBei.getName());
System.out.println(caoCao.getName());
System.out.println(liuBei);
System.out.println(caoCao);
结果 这次他们内部的引用地址是不相同的