• (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();
    

    唤醒

    唤醒所有

  • 相关阅读:
    Oracle关于快速缓存区应用原理
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.RequestContext
    速记const 指针与指向const的指针
    bzoj3992【SDOI2015】序列统计
    ubuntu 1204 安装mysql
    解决getOutputStream() has already been called for this response
    把一个project相关的jar放到project的lib文件夹中
    解决eclipse偶尔无视breakpoint的行为
    解决eclipse无法打开:Failed to load the JNI shared library
    挣值管理公式集合
  • 原文地址:https://www.cnblogs.com/heibaimao123/p/13849290.html
Copyright © 2020-2023  润新知