Object类


Object类

所有的类都继承于Object类,因此所有的类中都包含Object类中的方法

其内容包括:

public class Object {

    private static native void registerNatives();   //标记为native的方法是本地方法,底层是由C++实现的
    static {
        registerNatives();   //这个类在初始化时会对类中其他本地方法进行注册,本地方法不是我们SE中需要学习的内容,我们会在JVM篇视频教程中进行介绍
    }

    //获取当前的类型Class对象,这个我们会在最后一章的反射中进行讲解,目前暂时不会用到
    public final native Class<?> getClass();

    //获取对象的哈希值,我们会在第五章集合类中使用到,目前各位小伙伴就暂时理解为会返回对象存放的内存地址
    public native int hashCode();
        
        重要!!!!
    //判断当前对象和给定对象是否相等,默认实现是直接用等号判断,也就是直接判断是否为同一个对象
    public boolean equals(Object obj) {   
        return (this == obj);
    }
        
        重要!!!!  
    //克隆当前对象,可以将复制一个完全一样的对象出来,包括对象的各个属性
    protected native Object clone() throws CloneNotSupportedException;
        
        重要!!!!
    //将当前对象转换为String的形式,默认情况下格式为 完整类名@十六进制哈希值
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

    //唤醒一个等待当前对象锁的线程,有关锁的内容,我们会在第六章多线程部分中讲解,目前暂时不会用到
    public final native void notify();

    //唤醒所有等待当前对象锁的线程,同上
    public final native void notifyAll();

    //使得持有当前对象锁的线程进入等待状态,同上
    public final native void wait(long timeout) throws InterruptedException;

    //同上
    public final void wait(long timeout, int nanos) throws InterruptedException {
        ...
    }

    //同上
    public final void wait() throws InterruptedException {
        ...
    }

    //当对象被判定为已经不再使用的“垃圾”时,在回收之前,会由JVM来调用一次此方法进行资源释放之类的操作,这同样不是SE中需要学习的内容,这个方法我们会在JVM篇视频教程中详细介绍,目前暂时不会用到
    protected void finalize() throws Throwable { }
}

注:

  • equals方法判断为true的条件是两个变量所指的是同一个对象,即使两个变量所指对象的所有属性都相同,只要它们所指的不是同一个对象,也会返回false

    这时就需要进行方法的重写

  • Java中的拷贝(Clone)是浅拷贝

重要

toString

返回对象的字符串表示形式(包名.类名@地址值)

直接 println对象的话也实际上是调用了 toString 方法

但是打印出地址值并没有什么实际用处,我们可以重写 toString方法

equals (Object obj)

比较两个对象是否相等(默认为地址是否相等)

一般来讲地址值对于我们意义不大,所以我们会重写(直接用IDEA提供的就行),重写之后比较的就是对象内部的属性值了

注:String类中有定义的equals方法,其先判断的是是否属于String类,StringBuilder中没有定义的equals方法

clone

把A对象的属性值完全拷贝给B对象,也叫对象拷贝、对象复制

由于Object类中的clone方法为protected类型,这意味着只有同一个包内的类或子类才能访问它
想要使用的话必须要重写clone方法并将其访问权限改为 public,并且要在使用方法的类中实现Cloneable接口,并且在main方法中要抛出CloneNotSupportedException异常

注:Cloneable接口里没有任何方法

如果一个接口里面没有任何抽象方法,表示当前的接口是一个标记性接口

在克隆中,存在浅克隆深克隆

  • 浅克隆(clone默认):不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来
  • 深克隆:基本数据类型拷贝过来,字符串复用(串池),其他引用数据类型会重新创建新的

Author: havenochoice
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source havenochoice !
评论
  TOC