java 常用类库:Object类和Objects类

2022-11-25,,,,

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");

java 常用类库:Object类和Objects类的相关教程结束。

《java 常用类库:Object类和Objects类.doc》

下载本文的Word格式文档,以方便收藏与打印。