遇见1995

JDK - Object 对象之母

Object

Object

类对象是类层次结构的根
每个类都有一个作为超类的对象。
所有对象,包括数组,都实现这个类的方法。

Object

registerNatives() - 注册本地方法

本地方法:是联系Java程序和底层主机操作系统的连接方法

注册:除了registerNatives()方法以外的所有本地方法。即,

  • public final native Class<?> getClass();
  • public native int hashCode();
  • protected native Object clone() throws CloneNotSupportedException;
  • public final native void notify();
  • public final native void notifyAll();
  • public final native void wait(long timeout) throws InterruptedException;

一个Java程序要想调用一个本地方法,需要执行两个步骤:
第一,通过System.loadLibrary()将包含本地方法实现的动态文件加载进内存
第二,当Java程序需要调用本地方法时,虚拟机在加载的动态文件中定位并链接该本地方法,从而得以执行本地方法。

registerNatives()方法的作用就是取代第二步,让程序主动将本地方法链接到调用方,当Java程序需要调用本地方法时就可以直接调用,而不需要虚拟机再去定位并链接。

1
2
3
4
5
6
private static native void registerNatives();

// 静态代码块
static {
registerNatives();
}

这里顺便说一下代码块的执行顺序

代码块执行顺序

  1. 静态代码块
  2. 构造代码块
  3. 构造函数
  4. 普通代码块

继承中代码块执行顺序

  1. 父类静态块
  2. 子类静态块
  3. 父类代码块
  4. 父类构造器
  5. 子类代码块
  6. 子类构造器

hashCode() - 对象的哈希码值

对象的哈希码值

支持此方法的好处是可以使用散列表,比如java.util.HashMap提供的散列表。

在Java应用程序的执行过程中,无论何时在同一个对象上多次调用它,hashCode方法都必须一致地返回相同的整数,前提是不对对象上的equals比较中使用的信息进行修改。
此整数不需要在应用程序的一次执行与同一应用程序的另一次执行之间保持一致。
如果根据equals(Object)方法,两个对象是相等的,那么在每个对象上调用hashCode方法必须产生相同的整数结果。
如果两个对象根据equals(Object)方法是不相等的,那么在每个对象上调用hashCode方法必须产生不同的整数结果,这是不需要的。
但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能
在相当实际的情况下,类对象定义的hashCode方法确实会为不同的对象返回不同的整数。
(这通常是通过将对象的内部地址转换为整数来实现的,但是Java™编程语言并不需要这种实现技术。)

1
public native int hashCode();

toString() - 对象的字符串表示形式

对象的字符串表示形式

通常,toString方法会返回一个字符串,该字符串 “以文本形式表示” 该对象。
结果应该是简洁但信息丰富的表示,便于阅读。建议所有子类都重写此方法。

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

equals() - 判断是否对象相等

是否“ 等于 ” 这个对象。

1
2
3
public boolean equals(Object obj) {
return (this == obj);
}

clone() - 获取对象副本

创建并返回对象的副本

“copy”的确切含义可能取决于对象的类。
一般的意图是,对于任何对象x,表达式: x.clone () ! = x 将会是真的,
并且有这样的表达: = = x.getClass .getClass x.clone () () () 会是真的,但这些都不是绝对的要求。
而通常的情况是: x.clone () .equals (x)将是真的,这不是一个绝对的要求。

1
protected native Object clone() throws CloneNotSupportedException;

getClass() - 获取运行时类

对象的运行时类

返回的类对象是被所表示类的静态同步方法锁定的对象。
实际的结果类型是Class ,其中|X|是对调用getClass的表达式的静态类型的擦除。
例如,在这段代码中不需要强制转换:
n = 0;类< ?扩展号> c = n.getClass();

1
public final native Class<?> getClass();

notify() - 唤醒线程

唤醒等待的线程

如果有任何线程正在等待这个对象,则选择其中线程被唤醒。
这个选择是任意的,由实现来决定

1
2
3
4
5
// 单个线程
public final native void notify();

// 所有线程
public final native void notifyAll();

wait() - 线程等待

使当前的线程等待

直到另一个线程调用此对象的 notify()方法或 notifyAll()方法,
或其他一些线程中断当前线程,或已经过了一定时间。

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
public final void wait() throws InterruptedException {
// 调用下方,传入设定时间0
wait(0);
}
// 线程等待 / 经过一段时间
public final native void wait(long timeout) throws InterruptedException;

// 这个方法类似于一个参数的wait方法,但是它允许更好地控制在放弃之前等待通知的时间。
// 实时时间量,以纳秒为单位
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}

if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}

if (nanos > 0) {
timeout++;
}

wait(timeout);
}

当垃圾收集确定没有对对象的更多引用时,由对象上的垃圾收集器调用
一个子类覆盖finalize方法来处理系统资源或执行其他清理。

1
protected void finalize() throws Throwable { }

专题:

本文发表于 2020-03-16,最后修改于 2020-03-16。

本站永久域名yujian95.cn,也可搜索「 遇见1995 」找到我。

期待关注我的微信公众号「 编程图解 」 ,查看最近的文章和动态。


上一篇 « 高校社团管理微信小程序 下一篇 » 学习路径 - Java学习的正确打开方式

赞赏支持

请我吃包子 =^_^=

i ali

支付宝

i wechat

微信

推荐阅读

Big Image