美文网首页
Object类常用方法(12个)

Object类常用方法(12个)

作者: Timor小先生 | 来源:发表于2020-04-26 11:19 被阅读0次
    Object方法

    1、构造方法

    2、equals()和hashCode()方法

    equals是确认两个对象的值是否相等

    hashCode是获取对象的hash值,这个值是用来检索的(类比hashmap)

    二者关系:

    两个对象,如果equals值相等,那么hash值一定相等

    两个对象,如果hash值相等,equals值不一定相等

    java中判断两个对象相等的规则

    首先比较两个对象的hash值,如果一致,则进行下一步,否则两个对象不相等

    其次比较两个对象的equals值,如果一致,则两个对象相等,否则两个对象不相等

    3、toString()和getClass()方法

    toString()是返回一个String字符串,一般一个实体类在创建时都会重写toString(),注意null.toString()会报空指针异常,在打日志的时候首先要判断对象是否有null的情况

    getClass()在Object类中定义如下:(注意native,本地方法)

    经常用于java的反射机制(能够让运行与jvm中的程序检测和修改运行时的行为),当类加载以后,JVM 便自动产生一个Class 对象,使用该对象就可以获取一个类中的方法、成员以及构造方法的声明和定义等信息

    4、clone()

    Object类中源码定义如下:

    clone方法是用来另存一个已经存在的对象

    注意一下几点:

    Object的clone()被声明为proctected,让你无法从外部调用,其实就是等你为自己的类实现可从外部调用的clone()方法。protected的方法在自己的包中与public相同,在不同包,指的是通过自身实例(自身的引用)访问,而不能通过父类实例(引用)访问。具体请看测试代码:

    A:包编译通过,但是运行报CloneNotSupportedException异常,因为没重写clone方法

    B:包编译直接报错,不支持访问clone方法--和访问权限protected有关(没太理解)

    JDK并不预知你的自定义类包含有哪些数据及变量,因此最终clone()的实现一定得自力更生。

    C:正确的clone方法使用姿势

    首先实现Cloneable接口,重写Object的clone方法

    然后测试如下

    总结clone方法--首先Cloneable接口中没有任何方法,只是一个标志接口,若要实现克隆功能,实现Cloneable接口的类必须重写(自给自足)从Object类继承来的clone()方法,并调用Object的clone()方法,注意一点,重写后的clone方法修饰符是public,这样在任何地方都可以调用这个类的clone方法,而在Object类中clone方法的修饰符是protected(注意重写的访问修饰符权限)。

    5、finalize()

    在进行垃圾回收前会调用finalize()这个方法进行必要的清理工作

    finalize()在什么时候被调用?

    有三种情况

    1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.

    2.程序退出时为每个对象调用一次finalize方法。

    3.显式的调用finalize方法

    6、wait(),wait(long),wait(long,int),notify(),notifyAll()

    主要体现在多线程当中

    使用的时候要求在synchronize(锁)语句中

    wait()用于让当前线程失去操作权限,当前线程进入等待序列

    notify()用于随机通知一个持有对象的锁的线程获取操作权限

    notifyAll()用于通知所有持有对象的锁的线程获取操作权限

    wait(long) 和wait(long,int)用于设定下一次获取锁的距离当前释放锁的时间间隔

    线程状态关系

    线程在一定条件下,状态会发生变化。线程一共有以下几种状态:

    1、新建状态(New):新创建了一个线程对象。

    2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。

    3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

    4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

    阻塞的情况分三种:

    (1)、等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,

    (2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。

    (3)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

    5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

    相关文章

      网友评论

          本文标题:Object类常用方法(12个)

          本文链接:https://www.haomeiwen.com/subject/qhrdwhtx.html