Java Object浅克隆&深克隆
2023-12-31 17:39:30
对象克隆
把A对象的属性值完全拷贝给B对象,也叫对象拷贝,对象复制。
实现Cloneable接口,表示当前类的对象就可以被克隆,反之,表示当前类的对象就不能克隆。?
如果一个接口里面没有抽象方法,表示当前的接口是一个标记性接口。
?
- 浅克隆
不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来。
- 深克隆
基本数据类型拷贝过来(字符串复用),引用数据类型会重新创建新的地址。
代码示例:
public class User implements Cloneable {
private int id;
private String username;
private String password;
private String path;
private int[] data;
public User() {
}
public User(int id, String username, String password, String path, int[] data) {
this.id = id;
this.username = username;
this.password = password;
this.path = path;
this.data = data;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public int[] getData() {
return data;
}
public void setData(int[] data) {
this.data = data;
}
public String toString() {
return "角色编号为:" + id + ",用户名为:" + username + "密码为:" + password + ", 游戏图片为:" + path + ", 进度:" + arrToString();
}
public String arrToString() {
StringJoiner sj = new StringJoiner(", ", "[", "]");
for (int i = 0; i < data.length; i++) {
sj.add(data[i] + "");
}
return sj.toString();
}
@Override
protected Object clone() throws CloneNotSupportedException {
//调用父类中的clone方法
//相当于让Java帮我们克隆一个对象,并把克隆之后的对象返回出去。
//先把被克隆对象中的数组获取出来
int[] data = this.data;
//创建新的数组
int[] newData =new int[data.length];
//拷贝数组中的数据
for (int i = 0; i < data.length; i++) {
newData[i] = data[i];
}
//调用父类中的方法克隆对象
User u=(User)super.clone();
//因为父类中的克隆方法是浅克隆,替换克隆出来对象中的数组地址值
u.data =newData;
return u;
}
Object是Java中的顶级父类,所有的类都直接或间接的继承于Object类。
- toString(): 一般会重写,打印对象时打印属性。
- equals(): 比较对象时会重写,比较对象属性值是否相同。
- clone(): 默认浅克隆,如果需要深克隆需要重写方法或使用第三方工具类(如gson.xxx.jar)。
Objects
一个工具类,提供了一些方法去完成一些功能。
成员方法:
源码:
Objects.equals(a,b), 先比对两个对象地址是否相同,再判断调用内部equals的a是否为null,如果为null则直接返回false,不为null就继续比较属性值。
文章来源:https://blog.csdn.net/weixin_45719444/article/details/135317255
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!