Java - 【追根溯源】Object类

目录

  • Object类有何作用?
  • Object类中常见API
    • equals
    • getClass
    • toString
    • clone
  • 线程锁与wait()、notify()、notifyAll()


<一> Object类有何作用?

1> Object类为JAVA中所有类的父类,在继承体系中处于根(root)的位置,定义了一些基本API;

     官方文档:https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Object.html

2> 可以作为线程锁使用

<二> Object类中常见API

1> public boolean equals(Object obj)

  • equals只能比较引用类型
  • equals比较的是引用类型的地址(无意义),建议在每个子类中对该方法进行重写

equals官方具体实现:

2> public final Class<?> getClass()

注意这里的Class是大写,说明是一个类,查阅Class的API文档:

Class类有getName方法,可以以字符串返回类的全称:

3> public String toString()

  • 当直接输出对象时,会调用当前对象的toString()方法输出,若未重写则输出父类的toString();
  • 默认的toString()输出结果无意义,建议每个子类重写该方法;

4> protected Object clone() throws CloneNotSupportedException

  • 快速克隆出一个新的对象,内部成员与被克隆对象保持一致;
  • 被克隆的类需要实现Cloneable接口(该接口仅仅为标记接口,没有任何方法);
  • clone()方法返回Object对象,适当时候需要进行强转。

  • main函数需要额外添加:throws CloneNotSupportedException

<三> 线程

因为Object类是所有类的超类,任何对象均可作为线程锁对象;

wait()、notify()、notifyAll() 需要在同步代码块/同步函数中使用:

@Override
public void run() {
	synchronized (lock) {
		System.out.println("------");
		System.out.println("------");
		try {
			lock.wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("++++++++");
		System.out.println("++++++++");
	}
}

wait()会维护一个阻塞线程列表,notify和notify会按照不同规则唤醒其中被阻塞的线程。

示例:

/*WaitThread*/
public class WaitThread extends Thread{
	private final Object lock;
	
	public WaitThread(Object lock){
		this.lock = lock;
	}
	
	@Override
	public void run() {
		synchronized (lock) {
			System.out.println("------");
			System.out.println("------");
			try {
				lock.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("++++++++");
			System.out.println("++++++++");
		}
	}
}

/*NotifyThread*/
public class NotifyThread extends Thread {
	private final Object lock;
	
	public NotifyThread(Object lock){
		this.lock = lock;
	}
	
	@Override
	public void run() {
		synchronized (lock) {
			System.out.println("(((((((");
			System.out.println("(((((((");
			lock.notifyAll();
			System.out.println(")))))))");
			System.out.println(")))))))");
		}
	}
	
}

/*Demo*/
public class Demo{
	public static void main(String[] args) {
		Object lock = new Object();
		
		Thread th1 = new WaitThread(lock);
		Thread th2 = new WaitThread(lock);
		Thread th3 = new NotifyThread(lock);
		
		th1.start();
		th2.start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		th3.start();
		
	}
}

/*
------
------
------
------
(((((((
(((((((
)))))))
)))))))
++++++++
++++++++
++++++++
++++++++
*/

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 点我我会动 设计师:白松林 返回首页
实付 49.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值