目录

    • 专栏导读
    • 一、Object类简介
    • 二、Object提供了11种方法
      • 1、clone()
      • 2、getClass()
      • 3、toString()
      • 4、finalize()
      • 5、equals()
      • 6、hashCode()
      • 7、wait()
      • 8、notify()
      • 9、notifyAll()

专栏导读

🏆作者简介:哪吒,CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪 ,专注Java硬核干货分享,立志做到Java赛道全网Top N。

🏆本文收录于Java基础教程系列(进阶篇),本专栏是针对大学生、初级Java工程师精心打造,针对Java生态,逐个击破,不断学习,打通Java技术栈

🏆订阅后,可以阅读Java基础教程系列(进阶篇)中全部文章包含Java基础、Java高并发、Spring、MySQL等Java进阶技术栈

🏆还可以订阅其姐妹篇Java基础教程系列,包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例理论结合实战,实现Java的轻松学习

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。

🏆面试福音:10万字208道Java经典面试题总结(附答案)

大家好,我是哪吒。

一、Object类简介

Object类是Javajava.lang包下的核心类,Object类是所有类的父类,何一个类时候如果没有明确的继承一个父类的话,那么它就是Object的子类;
Java中所有的类默认继承Object类。

package com.guor.es.test;

public class Student {
    private Integer id;
    private String name;
}

package com.guor.es.test;

public class Student extends Object{
    private Integer id;
    private String name;
}

二者的效果是一样的。

二、Object提供了11种方法

1、clone()

protected native Object clone() throws CloneNotSupportedException;

实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。

2、getClass()

public final native Class<?> getClass();

final方法,返回Class类型的对象,反射来获取对象。

3、toString()

toString()方法返回一个字符串。

toString()无处不在,只要对象与一个字符串通过操作符 + 拼接,Java编译器就会自动地调用toString方法来获得这个对象的字符串描述。

还有我们最常用的System.out.println(name)方法,println会自动的调用name.toString(),并打印返回的字符串。

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

通过转为字符串,获取对象信息。
Object是最常见的Object方法。

package com.guor.es.test;

public class Student extends Object{
    private Integer id;
    private String name;

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

4、finalize()

protected void finalize() throws Throwable { }

该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。

5、equals()

public boolean equals(Object obj) {
        return (this == obj);
    }

判断内容是否相等,注意,这里比较的不是内存地址。
java语言规范要求equals方法具有下面的特性:

  • 自反性:对于任何非空引用x,x.equals(x)应该返回true;
  • 对称性:对于任何引用x,和y,当且仅当,y.equals(x)返回true,x.equals(y)也应该返回true;
  • 传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true;
  • 一致性:如果x,y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果;
  • 对于任意非空引用x,x.equals(null)返回false;

6、hashCode()

public native int hashCode();

该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
Java中Object有一个方法:

public native int hashcode();

(1)hashcode()方法的作用

hashcode()方法主要配合基于散列的集合一起使用,比如HashSet、HashMap、HashTable。

当集合需要添加新的对象时,先调用这个对象的hashcode()方法,得到对应的hashcode值,实际上hashmap中会有一个table保存已经存进去的对象的hashcode值,如果table中没有改hashcode值,则直接存入,如果有,就调用equals方法与新元素进行比较,相同就不存了,不同就存入。

(2)equals和hashcode的关系

如果equals为true,hashcode一定相等;

如果equals为false,hashcode不一定不相等;

如果hashcode值相等,equals不一定相等;

如果hashcode值不等,equals一定不等;

(3)重写equals方法时,一定要重写hashcode方法

7、wait()

public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos > 0) {
            timeout++;
        }

        wait(timeout);
    }

wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。

调用该方法后当前线程进入睡眠状态,直到以下事件发生。

  • 其他线程调用了该对象的notify方法。
  • 其他线程调用了该对象的notifyAll方法。
  • 其他线程调用了interrupt中断该线程。
  • 时间间隔到了。

此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

8、notify()

public final native void notify();

该方法唤醒在该对象上等待的某个线程。

9、notifyAll()

public final native void notifyAll();

该方法唤醒在该对象上等待的所有线程。

更多推荐

49天精通Java,第14天,java object类