概述
Java Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法
。
创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类
。
Object 类可以显式继承,也可以隐式继承
//显式继承
public class Runoob extends Object{
}
//隐式继承
public class Runoob {
}
常用方法
clone()
clone 方法是浅拷贝
,对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存
,相对应的深拷贝则会连引用的对象也重新创建。
object.clone()
equals()
equals() 方法比较两个对象,是判断两个对象引用指向的是同一个对象,即比较 2 个对象的内存地址是否相等
。
注意:如果子类重写了 equals() 方法,就需要重写 hashCode() 方法,比如 String 类就重写了 equals() 方法,同时也重写了 hashCode() 方法。
object.equals(Object obj)
如果两个对象相等返回 true,否则返回 false。
finalize()
Object finalize()
方法用于实例被垃圾回收器回收的时触发的操作。
当 GC (垃圾回收器) 确定不存在对该对象的有更多引用时,对象的垃圾回收器就会调用这个方法
。
protected void finalize()
// 创建 RunoobTest 对象
RunoobTest cal = new RunoobTest();
cal.finalize();
getClass()
方法用于获取对象的运行时对象的类
object.getClass()
返回对象的类。
class RunoobTest {
public static void main(String[] args) {
// getClass() with Object
Object obj1 = new Object();
System.out.println("obj1 的类为: " + obj1.getClass());
// getClass() with String
String obj2 = new String();
System.out.println("obj2 的类为: " + obj2.getClass());
// getClass() with ArrayList
ArrayList<Integer> obj3 = new ArrayList<>();
System.out.println("obj3 的类为: " + obj3.getClass());
}
}
/*
obj1 的类为: class java.lang.Object
obj2 的类为: class java.lang.String
obj3 的类为: class java.util.ArrayList
*/
自定义类调用 getClass() 方法
class RunoobTest {
public static void main(String[] args) {
// 创建 RunoobTest 类的对象
RunoobTest obj = new RunoobTest();
// RunoobTest 继承 Object 类,Object 是所有类的超类
// 调用 getClass() 方法
System.out.println(obj.getClass());
}
}
/*
class RunoobTest
*/
hashCode()
方法用于获取对象的 hash 值。
object.hashCode()
返回对象哈希值,是一个整数,表示在哈希表中的位置
。
notify()
唤醒在该对象上等待的某个线程
Object notify() 方法用于唤醒一个在此对象监视器上等待的线程
。
- 如果所有的线程都在此对象上等待,那么只会选择一个线程,
选择是任意性的
,并在对实现做出决定时发生。
一个线程在对象监视器上等待可以调用 wait() 方法。
notify() 方法只能被作为此对象监视器的所有者的线程来调用
。
如果当前线程不是此对象监视器的所有者的话会抛出 IllegalMonitorStateException 异常。
一次只能有一个线程拥有对象的监视器
public final void notify()
没有返回值。
notifyAll()
Object notifyAll() 方法用于唤醒在该对象上等待的所有线程
notifyAll() 方法跟 notify() 方法一样,区别在于 notifyAll() 方法唤醒在此对象监视器上等待的所有线程,notify() 方法是一个线程
。
如果当前线程不是对象监视器的所有者,那么调用 notifyAll() 方法同样会发生 IllegalMonitorStateException 异常。
public final void notifyAll()
没有返回值。
toString()
Object toString() 方法用于返回对象的字符串表示形式。
object.toString()
返回对象的字符串表示形式。
默认返回格式:对象的 class 名称 + @ + hashCode 的十六进制字符串。
wait()
wait() 方法让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法
。
当前线程必须是此对象的监视器所有者,否则还是会发生 IllegalMonitorStateException 异常。
如果当前线程在等待之前或在等待时被任何线程中断,则会抛出 InterruptedException 异常。
public final void wait()
没有返回值
wait(long timeout)
wait(long timeout) 方法让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过参数 timeout 设置的超时时间。
如果 timeout 参数为 0,则不会超时,会一直进行等待,类似于 wait() 方法
。
当前线程必须是此对象的监视器所有者,否则还是会发生 IllegalMonitorStateException 异常。
如果当前线程在等待之前或在等待时被任何线程中断,则会抛出 InterruptedException 异常。
如果传递的参数不合法,则会抛出 IllegalArgumentException 异常。
public final void wait(long timeout)
timeout - 等待时间(以毫秒为单位)
没有返回值。
void wait(long timeout, int nanos)
与 wait(long timeout) 方法类似,多了一个 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒
。
导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法,或者已经过了指定的时间量。
public final void wait(long timeout, int nanos)
参数:
- timeout - 等待的最长时间(以毫秒为单位)。
- nanos - 额外时间,以纳秒为单位,范围为0-999999。
1000000*timeout+nanos
此方法无返回值。