Object类

结构

image.png

源码

package java.lang;

public class Object {

    private static native void registerNatives();
  
/**
静态代码块 一进来就执行native 方法
*/
    static {
        registerNatives();
    }

   
    public final native Class getClass();

    public native int hashCode();

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

  
    protected native Object clone() throws CloneNotSupportedException;

  
    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 {
        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 >= 500000 || (nanos != 0 && timeout == 0)) {
            timeout++;
        }

        wait(timeout);
    }

   
    public final void wait() throws InterruptedException {
        wait(0);
    }

  
    protected void finalize() throws Throwable { }
}

示例类

package com.ghg.mybatis_study.test;

public class User {

    private String userName;
    private Integer age;
    
    public User(String userName, Integer age) {
        super();
        this.userName = userName;
        this.age = age;
    }
    public User() {
        super();
    
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }

}

registerNatives

 private static native void registerNatives();
    static {
        registerNatives();
    }

该方法被声明为是一个private static native方法,该方法的调用执行是在接下来声明的static块中:
该方法主要是为了服务于JNI(Java Native Interface)的,它主要是提供了java类中的方法与对应C++代码中的方法的映射,方便jvm查找调用C++中的方法。

getClass()方法

public final native Class getClass();

该方法被声明为public final native方法,这说明该方法无法被重写,且是一个本地方法,通过API文档,我们可以了解到:该方法将返回对象的运行时类。例如

public static void main(String[] args) {
        User user = new User();
        System.out.println(user.getClass());

    }

class com.ghg.mybatis_study.test.User

equals方法

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

可以看出默认情况下equals进行对象比较时只判断了对象是否是其自身,当我们有特殊的“相等”逻辑时,则需要覆盖equals方法。

public static void main(String[] args) {
        User user1 = new User("张三",18);
        User user2 = new User("张三",18);
    
        System.out.println(user1.equals(user2));
    }

false

重写equals

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof User))
            return false;

        User other = (User) obj;

        return other.getUserName().equals(this.userName) && other.getAge().equals(this.age);
    }

hashCode方法

 public native int hashCode();

不是static的可以被重写
看下默认的

public static void main(String[] args) {
        User user = new User();
        System.out.println(user.getClass());
        System.out.println(user.hashCode());
    }

class com.ghg.mybatis_study.test.User
869295101

当我们覆盖了equals方法时,一定不能忘记覆盖hashCode方法。

重写hashCode

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((age == null) ? 0 : age.hashCode());
        result = prime * result + ((userName == null) ? 0 : userName.hashCode());
        return result;
    }

toString

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

默认的toString方法仅仅返回类名+当前实例hashCode值的十六进制串
例如:

public static void main(String[] args) {
        User user1 = new User("张三",18);
        User user2 = new User("张三",18);
    
        System.out.println(user1.equals(user2));
        System.out.println(user1.toString());
        System.out.println(user2.toString());
    }

true
com.ghg.mybatis_study.test.User@bd8d8
com.ghg.mybatis_study.test.User@bd8d8

重写


    @Override
    public String toString() {
        return "User [userName=" + userName + ", age=" + age + "]";
    }

true
User [userName=张三, age=18]
User [userName=张三, age=18]

clone方法

 protected native Object clone() throws CloneNotSupportedException;

clone方法将创建和返回该对象的一个拷贝。这个“拷贝”的精确含义取决于该对象的类。

一个标准的clone实现需要做到以下两点:

(1)调用super.clone()方法

(2)对于对象中的所有引用类型,均需要实现Cloneable接口,并重写clone方法,然后对每个引用执行clone方法。

wait、notify、notifyAll方法

 public final void wait() throws InterruptedException {
        wait(0);
    }
public final native void notify();
 public final native void notifyAll();

这三个方法都是public final native的。不可以被子类重新,且都是本地方法。这三个方法提供了java线程间等待、挂起等协同机制,是java多线程的基础

finalize

protected void finalize() throws Throwable { }

“当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法”。

“finalize方法可以采取任何操作,其中包括再次使此对象对其他线程可用;不过,finalize的主要目的是在不可撤消地丢弃对象之前执行清除操作”。

“Java 编程语言不保证哪个线程将调用某个给定对象的finalize方法”。

“对于任何给定对象,Java 虚拟机最多只调用一次finalize方法”。

你可能感兴趣的:(Object类)