(2)java.lang.Object

java.lang.Object

所有类都直接或间接继承该类

1、类结构

public class Object

2、native

native方法:指非Java语言写的方法,一般是系统提供的,对底层进行直接操作。由关键字native声明,jvm进行调用。

(除非是开始系统深入学习虚拟机,否则很难,也没有必要学习native的实现)

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

registerNatives方法具体做什么暂时不用研究,按名字大概是对本类中的native方法进行注册

该方法出现的类一定有其它native方法,比如java.lang.System。

而包含native方法的类也可能没有该方法,比如java.lang.String。

3、构造方法

只有默认的构造方法

4、 其它方法

(1)克隆

protected native Object clone() throws CloneNotSupportedException;

对象克隆,需要实现java.lang.Cloneable接口,然后重写Object的clone方法。

参考

浅拷贝:只是创建新的对象,对象属性是原对象的属性

深拷贝:不仅创建新的对象,同时对原属性也进行创建。

第三种方案:不实现java.lang.Cloneable,而是实现java.io.Serializable接口完成深拷贝

(2)等于

==:

  • 不能判断基本数据类型和一个引用数据类型
  • 判断两个引用数据类型是判断地址
  • 判断两个基本数据类型是判断值
  • 同时boolean类型不能和其它基本类型比较
public boolean equals(Object obj) {
    return (this == obj);
}
  • 只有非null的引用数据类型对象才能调用equas方法
  • this指代本类的当前对象

比较的几个准则:

  • 自反性:a.equals(b)为true,反之b.equals(a)也为true,false是一样的,obj为null除外。
  • 传递性:a.equals(b)为true,b.equals(c)为true,则a.equals(c)也为true
  • 持久性:只要本身没有发生改变,a.equals(b)的结果应该一直不变
  • a.equals(b),b为null则结果为false

在子类重写equals方法时也应该遵守这几条规则。

(3)finalize完成

protected void finalize() throws Throwable { }

是手动进行资源回收的,慎用。

在Java11被废弃

(4)hash码

public native int hashCode();

哈希算法:指一种算法模型,具体由其它算法实现,比如md4,md5。

该算法是单向的,即只能加密而无法解密。

哈希算法是将一个不定长度的数据映射成一个固定长度的数据,结果即为哈希码。根据哈希码无法求得原值。

相同对象的哈希码一定相同,不同对象的哈希码也可能相同。

实际上,哈希码不是完全无法取得原值,有人将常用文本映射成哈希码做成一张表,通过查询哈希码,能够得到一组原值。但是无法准确求得,也保证原值一定在这组数据之中。

Java的Object对象的哈希码是通过地址相关来求得的。

(5)获取Class对象

public final native Class<?> getClass();

Class类对象是在类加载的时候由虚拟机创建的,唯一。

Student student = new Student();
student.setName("张三");
Student student1 = new Student();
System.out.println(student1.getClass() == student.getClass());

结果为true

(6)toString

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

输出对象的Class类名和哈希码的十六进制字符串。

(7)wait

public final void wait() throws InterruptedException {
    wait(0);
}
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:让当前线程进入等待状态(挂起),同时释放当前线程持有的锁。直到其它线程调用此对象的notify或notifyAll方法,该线程被唤醒进入就绪状态。

wait():立即挂起

wait(long timeout):单位毫秒

wait(long timeout, int nanos):毫秒,纳秒

(8)notify、notifyAll

public final native void notify();
public final native void notifyAll();

唤醒

唤醒所有

原文地址:https://www.cnblogs.com/heibaimao123/p/13849290.html