java 常用类库:Object类和Objects类

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

 

 

posted on 2021-04-06 19:58  zhangmingda  阅读(514)  评论(0编辑  收藏  举报

导航