getClass()方法
- 返回Object的运行类型
- 不可重写,要调用的话,一般和getName()联合使用,如
getClass().getName()
publicstaticvoidmain(String[] args) {
Objecto=newObject();
System.out.println(o.getClass().getName()); // java.lang.Object
System.out.println(o.getClass()); // class java.lang.Object
}
4、finalize()方法
- 用于释放资源,由于无法确定该方法什么时候被调用,很少使用
- 工作原理:
- 垃圾回收器准备好释放对象占用的存储空间,首先调用finalize()方法
- 并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存
- 用途:
- 无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存
- 这就将对finalize()的需求限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间
- 不过这种情况一般发生在使用”本地方法“的情况下,本地方法是一种在Java中调用非Java代码的方式
垃圾回收
- 对象可能不被垃圾回收。只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放
- 垃圾回收并不等于”析构“
- 析构函数:与构造函数相反,用于在对象调用完毕时回收(delete)对象开辟(new)的存储空间
- 垃圾回收只与内存有关。使用垃圾回收的唯一原因是为了回收程序不再使用的内存
5、equals()方法
- 判断两个对象是否相等(判断两个对象引用指向的是否为同一个对象,即*内存地址*是否相同)
object.equals(Object obj 要比较的对象)
- 注意:
- 如果子类重写equals()方法,就需要重写hashCode()方法,比如String类就重写了equals()方法,同时也重写了hashCode()方法
- 即便是内容完全相同的两块不同内存的对象,也返回false
==和equals()的区别
==
- 前提条件:比较两边的类型要一致,不然编译会报错
- 对于基本数据类型:比较两个数据的值是否相等
- 对于引用数据类型:比较两个对象地址值是否相等
equals
- 是一个方法,只适用于引用数据类型
- Object类中equals()的定义:和==的作用相同(比较两个对象的地址值是否相等)
- 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相等,而是比较两个对象的“实体内容”是否相同
- 通常情况下,我们自定义类使用equals()的目的是比较两个对象的"实体内容"是否相等,那么就需要手动重写(可以在IDE中使用快捷键自动重写)
6、hashCode()方法
- 返回该对象的哈希值(一个整数,表示在哈希表中的位置)
- 两个对象相等他们的哈希值一定相等,反之则未必(相同的哈希值下可能有多个值,那些值之间不一定相等)
- 要判断两个值是否真正相等需要使用equals()方法
7、notify()方法
- 唤醒在该对象上等待(wait()方法)的某个线程(随意)
- notifyAll():唤醒在该对象上等待的所有线程
8、wait()方法
- 让线程进入等待状态,直到其他线程调用此对象的notify()方法或notifyAll()方法
- 当前线程必须是此对象的监视器所有者,否则会发生IllegalMonitorStateException 异常。
- 如果当前线程在等待之前或在等待时被任何线程中断,则会抛出 InterruptedException 异常
- timeout 要等待的最长时间(单位:毫秒)
- nanos 额外时间(单位:微妙)