1,Object类:
Object类是所有的类,数组,枚举的父类,也就是说,JAVA中允许把任何的对象赋值给Object类(包括基础数据类型),当定义一个类的时候,没有使用extends关键字显示指定父类的时候,默认集成Object类。因为所有类都是Object的子类,所以所有的对象都可以调用Object类的方法。
2,Object常用方法:
(1),boolean equals(Object obj):
判断指定对象与该对象是否相等。此处默认判断相等,其实就是判断两个变量的内存地址是不是同一个,因此这个equals方法通常没有太大的实用价值。我们通常需要在子类中重写。
(2),protected void finalize():
当一个类的状态是可恢复状态的时候,垃圾回收器会自动调用该方法,然后回收内存。
(3),String toString():
返回对象的字符串表达形式,当程序使用System.out.println()输出一个对象的时候,或者把对象与字符串做拼接的时候,会调用该方法。一般情况下需要重写。
3,对象克隆:clone()
java的Object类还提供了一个protected类型的clone方法,该方法用于帮助其他对象实现自我克隆,就是得到一个当前对象的副本,而且两者之间完全隔离。由于Object类提供的clone方法使用了protected,因此该方法只能被子类重写或者调用。
自定义类实现克隆的步骤:
(1),实现Cloneable接口。这是一个标记性的接口,实现该接口的对象可以实现“自我克隆”,接口里面没有定义任何方法。
(2),自定义类实现了自己的clone()方法。
(3),实现clone()方法时通过super.clone(),调用Object实现的clone方法来得到该对象的副本。并且立刻返回该副本。
package com.zmd.common_class_libraries; import java.util.Objects; /** * @ClassName CloneTest * @projectName: object1 * @author: Zhangmingda * @description: XXX * date: 2021/4/6. */ public class CloneTest { private static class Address { String Detail; public Address(String detail) { Detail = detail; } } private static class User implements Cloneable{ private int age; private Address address; public User(int age) { this.age = age; this.address = new Address("河北承德"); } //重写clone方法返回User对象,返回值需要强制转换一下:(User) @Override protected User clone() throws CloneNotSupportedException { return (User)super.clone(); } } //测试方法 public static void main(String[] args) throws CloneNotSupportedException { User user = new User(18); User user1 = user.clone(); System.out.println(user == user1); System.out.println(user.address == user1.address); System.out.println(user.age == user1.age); } }
克隆对象内存示意图图:
上面这个方式其实就是一个浅克隆,就是简单的堆对象的各个变量进行了复制,如果是引用变量类型,实际上指向的还是同一个内存地址。
如果我们要深克隆怎么办?
程序员自己写代码实现
3,Objects类:
java7之后提供了一个Objects类,它其实就是一个对象操作的工具类,他提供了很多工具方法,这些方法都是空指针安全的。
(1),什么是空指针安全
其实就是当一个对象为null的时候,你去调用这个对象对应的方法,那就会触发空指针异常,有可能因为这个异常导致你的程序崩溃。
(2),工具方法
User user = null; /** * 报错空指针异常 System.out.println(user.address); System.out.println(user.hashCode()); System.out.println(user.toString()); */ //使用Objects类获取null对象的Object的方法 System.out.println(Objects.hashCode(user)); //返回0 System.out.println(Objects.toString(user)); //返回null //使用Objects工具类创建User对象,设置不允许对象为null并且设置错误提示。 User user1 = Objects.requireNonNull(user,"User不允许为null");