01-JAVA常用API-Object,Objects

文章详细介绍了Java中的对象克隆,包括浅克隆和深克隆的概念,以及如何通过重写`clone()`方法实现深克隆。此外,还提到了使用Gson库进行对象序列化作为实现深克隆的一种便捷方式。同时,文章讨论了`Objects`类的用途,特别是其在处理`null`对象时的方法,如`equals()`、`isNull()`和`nonNull()`。
摘要由CSDN通过智能技术生成

..................


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");
}
Objects的成员方法
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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值