Posts Java Object
Post
Cancel

Java Object

Java Object

超类Object

java中,所有类都默认继承一个超类,最顶层类,就是Object类。’’

jdk类文件描述

1
2
3
4
5
6
7
8
9
/**
 * Class {@code Object} is the root of the class hierarchy.
 * Every class has {@code Object} as a superclass. All objects,
 * including arrays, implement the methods of this class.
 *
 * @author  unascribed
 * @see     java.lang.Class
 * @since   JDK1.0
 */

上面提到,包括数组,都实现了Object的方法。

不管是新建的类,或者继承的类,顶类还是object对象。如果编写自定义类没有 extends 父类,那么父类就是Object

既然Object是一个顶部超类,自然特殊重要,并且公开类方法,其他类也有,需要了解

公共方法

getClass()

对象调用此方法,获取对象的类文件对象,即Class实例对象

1
public final native Class<?> getClass(); //native 标识,说明是调用jvm底层方法(C语言) final

hashCode()

获取哈希码方法,java中区分对象,分配对象位置,需要用到,默认应该是与对象内存地址有关的值,且唯一。

1
public native int hashCode(); //native 可以重写

equals(Object object)

用于判断两个对象是否相等,子类可以重写自定义

1
2
3
public boolean equals(Object obj) {
        return (this == obj); //这里 == 判断的是两个对象在内存中的地址值
}

toString()

对象标志方法,默认是类名+@+hashCode()值,可重写自定义

1
2
3
public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

wait()

java线程相关方法,在多线程场景,cpu资源分配问题上使用,可使当前线程等待 (搭配synchronize使用)。调用wait时,线程会释放对应的锁资源 wait(long timeout) 一样,就是可以设置wait时间,更细节,机制是一样的。 wait() 则调用 wait(0);

1
2
3
4
public final void wait() throws InterruptedException {
        wait(0);
}	
public final native void wait(long timeout) throws InterruptedException; //native & final

notify()

与wait()方法对应,锁资源,试图唤醒其他wait 线程(某一个),notifyAll() 则是唤醒所有等待线程

1
public final native void notify();  //native & final

示例

启动多个线程,按照预定顺序启动(数值大的优先启动,通过 wait 和 notify达到控制效果)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package javabasis.lang;

public class MyThread extends Thread{

	
	private static Object lock = new Object(); //锁对象
	
	private static volatile int threshold;  // 线程启动阈值
	
	
	private int num;  //对象标识

	public MyThread(int num) { //有参构造
		super();
		this.num = num;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	/*
	 * 重写线程run方法
	 */
	@Override
	public void run() {
		synchronized (lock) {
			
			while(this.num < threshold) { // 数值小于阈值,不能执行任务,进入等待状态
				try {
					lock.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			threshold --; // 没启动一个线程任务,阈值减一
			System.out.println("..>" + this.getName() + ":num="+ this.num +"*执行任务");
			lock.notifyAll(); //唤醒其他等待线程(与lock锁关联的线程)
		}
	}
	
	
	public static void main(String[] args) {
		int h = 31; 
		threshold = h - 1;  //阈值为30
		for (int i = 0; i < h; i ++) {
			new MyThread(i).start();  //启动线程
		}
	}
	
}

/*控制台输出结果
..>Thread-30:num=30*执行任务
..>Thread-29:num=29*执行任务
..>Thread-28:num=28*执行任务
..>Thread-27:num=27*执行任务
..>Thread-26:num=26*执行任务
..>Thread-25:num=25*执行任务
..>Thread-24:num=24*执行任务
..>Thread-23:num=23*执行任务
..>Thread-22:num=22*执行任务
..>Thread-21:num=21*执行任务
..>Thread-20:num=20*执行任务
..>Thread-19:num=19*执行任务
..>Thread-18:num=18*执行任务
..>Thread-17:num=17*执行任务
..>Thread-16:num=16*执行任务
..>Thread-15:num=15*执行任务
..>Thread-14:num=14*执行任务
..>Thread-13:num=13*执行任务
..>Thread-12:num=12*执行任务
..>Thread-11:num=11*执行任务
..>Thread-10:num=10*执行任务
..>Thread-9:num=9*执行任务
..>Thread-8:num=8*执行任务
..>Thread-7:num=7*执行任务
..>Thread-6:num=6*执行任务
..>Thread-5:num=5*执行任务
..>Thread-4:num=4*执行任务
..>Thread-3:num=3*执行任务
..>Thread-2:num=2*执行任务
..>Thread-1:num=1*执行任务
..>Thread-0:num=0*执行任务

*/

clone()

对象克隆方法,是jvm的native方法,更具对象字节复制,真正需要clone的时候,需要实现CloneAble接口,重写Object的clone()方法

1
protected native Object clone() throws CloneNotSupportedException;  

finalize()

与jvm内存回收有关的方法

1
protected void finalize() throws Throwable { }

实际开发中用到比较少,想了解finalize更多,可以查阅资料

https://www.cnblogs.com/langtianya/p/4401062.html

This post is licensed under CC BY 4.0 by the author.

Oracle

SpringCloud-ServerConfig

Comments powered by Disqus.