对象克隆
把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();}@Overrideprotected 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就继续比较属性值。