..................
Clone:
对象克隆:把A对象的属性值完全拷贝给B对象,也叫对象拷贝,对象复制.
作用:游戏中用户属性进行丰富例如id设置成管理员,玩家等等.....转区等功能.
//1.先创建一个对象
int[] date = {1,2,3,4,5,6,7,8,9,10};
user u1 = new user(1,zhangsan,"123sqwer","girl11",data);
//2.克隆对象(对克隆方法在JavaBean类中进行重写)
user u2 = (user)u1.clone();
system.out.println(u1);
system.out.println(u2);
//方法在底层会帮我们创建一个对象,并把原来对象的数据拷贝过去.
//书写细节:
//1.重写object中的clone方法.
//2.让JavaBean类负责cloneable接口.
//3.创建对象并调用clone就可以了.
基本数据类型:存储的是真实的值.
引用数据类型:存储的是另一个空间的地址值
.浅克隆:基本数据类型变量记录的数据值直接拷贝过来,引用数据类型拷贝地址值
深克隆:基本数据类型变量记录的数据值直接拷贝过来,引用数据类型在外面从新创建一个数据类型,字符串会复用,因为字符串都在串池中
小结:
浅克隆:不管是对象内部的基本数据类型还是引用数据类型,都完全拷贝过来
深克隆:基本数据类型拷贝过来,字符串进行复用,引用数据类型会重新创建新的小空间
object是浅克隆方式:
user u2 = (user)u1.clone;
//验证一件事:object中的克隆是浅克隆
int[] arr = u1.getDate();
arr[0] = 100;
system.out.println(u1);
system.out.println(u2);
//跟着改是浅克隆,否则是深克隆,答案显示是浅克隆
深克隆方法:重写clone方法
@override
protected object clone() throws clonenotsupportedexception{
//调用父类中的clone方法
//相当于让Java帮我们克隆一个对象,并把克隆之后的对象返回出去.
//先把被克隆对象中的数组获取出来
int[] data = this,data;
//创建新的数组
int[] newDate = 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;
}
深克隆写起来很麻烦,我们会使用一个第三方工具导入包对象的序列化gson.jar,编写代码:
//第三方的工具
//1.第三方写的代买导入到项目中
//2.编写代码
Gson gson = new Gson();
//把对象变成一个字符串
string s = gson.toJson(u1);
//再把字符串变回对象就可以了
User user = gson.fromJson(s,User.class);
/*验证*/
int[] arr = u1.getDate();
arr[0] = 100;
//打印对象
system.out.println(user);
总结:
Object:是Java中的顶级父类.
所有的类都直接或者间接的继承object类.
tostring():一般会重写,打印对象时打印属性
equals():比较对象时会重写,比较对象属性值是否相同
clone():默认克隆为浅克隆
如果需要深克隆需要重写方法或者使用第三方类
Objects:
Objects是一个工具类,提供了一些方法去完成一些功能.
Java中不可以用null调用方法.
例子:
//创建学生类的对象
Student s1 = null;
Student s2 = new Student("zhangsan",23);
//比较两个对象的属性值是否相同
if(s1 != null){
boolean result = s1.equals(s2);
System.out.println(result);
}else{
System.out.println("null");
}
public static boolean equals(Object a,Object b) | 先做非空判断,比较两个对象 |
public static boolean isNull(Object obj) | 判断对象是否为null,为null返回true,反之 |
public static boolean nonNull(Object obj) | 判断对象是否为null,跟isNull的结果相反 |
boolean result = Objects.equals(s1,s2);
System.out.println(result);
//细节
//方法的底层会判断s1是否为null,如果为null,直接返回false
//如果s1不为null,那么就利用s1再次调用equals方法
//如果s1是Student类型,所以最终还是会调用Student中的equals方法
//如果没有重写,比较地址值,如果重写,就比较属性值.
Student s3 = new Student();
Student s4 = null;
System.out.println(Objects.isNull(s3));
System.out.println(Objects.isNull(s4));
System.out.println(Objects.nonNull(s3));
System.out.println(Objects.nonNull(s4));