JAVA Object 类

转载:https://www.jianshu.com/p/852faf4dc8f1

 

1、getClass方法:public final native Class<?> getClass();

getClass方法返回的是当前实例对应的Class类,也就是说不管一个类有多少个实例,每个实例的getClass返回的Class对象是一样的

 

2、hashCode方法:public native int hashCode();

对象的哈希码主要用于在哈希表中的存放和查找等。Java中对于对象hashCode方法的规约如下:

1)在java程序执行过程中,在一个对象没有被改变的前提下,无论这个对象被调用多少次,hashCode方法都会返回相同的整数值。对象的哈希码没有必要在不同的程序中保持相同的值。

2)如果2个对象使用equals方法进行比较并且相同的话,那么这2个对象的hashCode方法的值也必须相等。

3)如果根据equals方法,得到两个对象不相等,那么这2个对象的hashCode值不需要必须不相同。但是,不相等的对象的hashCode值不同的话可以提高哈希表的性能。

 

3、equals方法:Java要求一个类的equals方法和hashCode方法同时覆写

    public boolean equals(Object obj) {

        return (this == obj);

    }

 equals方法用于判定两个对象是否相等。Object中的equals方法其实默认比较的是两个对象是否拥有相同的地址。

也就是"=="对应的内存语义

 

equals方法在非空对象引用上的特性:

1)reflexive,自反性。任何非空引用值x,对于x.equals(x)必须返回true

2)symmetric,对称性。任何非空引用值x和y,如果x.equals(y)为true,那么y.equals(x)也必须为true

3)transitive,传递性。任何非空引用值x、y和z,如果x.equals(y)为true并且y.equals(z)为true,那么x.equals(z)也必定为true

4)consistent,一致性。任何非空引用值x和y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改

对于任何非空引用值 x,x.equals(null) 都应返回 false

 

4、clone方法:protected native Object clone() throws CloneNotSupportedException;

用于克隆一个对象,被克隆的对象需要implements Cloneable接口,否则调用这个对象的clone方法,将会抛出CloneNotSupportedException异常。克隆的对象通常情况下满足以下三条规则:

 

x.clone() != x,克隆出来的对象和原来的对象不是同一个,指向不同的内存地址

x.clone().getClass() == x.getClass()

x.clone().equals(x)

 

一个对象进行clone时,原生类型和包装类型的field的克隆原理不同。对于原生类型是直接复制一个,而对于包装类型,则只是复制一个引用而已,并不会对引用类型本身进行克隆。

 

浅拷贝:对引用进行了拷贝,指向的还是同一块内存地址。

深拷贝:对一个对象深拷贝时,对于对象的包装类型的属性,会对其再进行拷贝,从而达到深拷贝的目的

 

5、toString方法:

    public String toString() {

        return getClass().getName() + "@" + Integer.toHexString(hashCode());

    }

 

6、notify方法和notifyAll方法:

    public final native void notify();

    public final native void notifyAll();

 

notify方法用于唤醒正在等待当前对象监视器的线程,唤醒的线程是随机的。一般notify方法和wait方法配合使用来达到多线程同步的目的。

在一个线程被唤醒之后,线程必须先重新获取对象的监视器锁(线程调用对象的wait方法之后会让出对象的监视器锁),才可以继续执行

一个线程在调用一个对象的notify方法之前必须获取到该对象的监视器(synchronized),否则将抛出IllegalMonitorStateException异常。同样一个线程在调用一个对象的wait方法之前也必须获取到该对象的监视器。

 

7、wait方法

    public final native void wait(long timeout) throws InterruptedException;

    public final void wait() throws InterruptedException {

        wait(0);

    }

 

wait方法一般和上面说的notify方法搭配使用。一个线程调用一个对象的wait方法后,线程将进入WAITING状态或者TIMED_WAITING状态。直到其他线程唤醒这个线程。

线程在调用对象的wait方法之前必须获取到这个对象的monitor锁,否则将抛出IllegalMonitorStateException异常。线程的等待是支持中断的,如果线程在等待过程中,被其他线程中断,则抛出InterruptedException异常。

如果wait方法的参数timeout为0,代表等待过程是不会超时的,直到其他线程notify或者被中断。如果timeout大于0,则代表等待支持超时,超时之后线程自动被唤醒。

 

8、finalize方法   

 protected void finalize() throws Throwable { }

垃圾回收器在回收一个无用的对象的时候,会调用对象的finalize方法,我们可以覆写对象的finalize方法来做一些清除工作。

finalize方法中对象其实还可以"自救",避免垃圾回收器将其回收。在finalize方法中通过建立this的一个强引用来避免GC:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值