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()方法,该线程结束生命周期。
网友评论