zoukankan      html  css  js  c++  java
  • 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");
  • 相关阅读:
    【从零开始学Spring笔记】Spring学习路线
    【从零开始学Java笔记】目录
    【超详细全过程】安装IntelliJ IDEA下载
    【超详细全过程】JavaEE 开发环境安装全过程(jdk+tomcat+eclipse)
    【超详细全过程】安装MySQL+Navicat
    Eclipse更新maven项目仓库依赖
    变量
    二进制
    JVM虚拟机查找类文件的顺序
    JRE、JDK概述
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/14623484.html
Copyright © 2011-2022 走看看