概述
文章目录
- 前言
- 0.Object()
- 1.registerNatives()
- 2.getClass()
- 3.hashCode()
- 4.equals
- 5.clone()
- 6.toString()
- 7.JUC相关方法
- 8.finalize()
- 总结
前言
Java中最顶层的父类是Object,这是一道送分题。
而里面有什么方法,一般程序员都答不全(因为正常情况不需要记这么多)。
让我们先看一下源码概览
private static native void registerNatives();
//返回此对象的运行时类.
public final native Class<?> getClass();
//返回对象的哈希码值.
public native int hashCode();
//判断其他对象obj是否“等于”当前对象.
public boolean equals(Object obj);
//创建并返回此对象的副本.
protected native Object clone() throws CloneNotSupportedException;
//返回对象的字符串表示.
public String toString();
//唤醒在此对象监视器上等待的单个线程.
public final native void notify();
//唤醒在此对象监视器上等待的所有线程
public final native void notifyAll();
//使当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法,或经过了指定的时间。
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException;
public final void wait() throws InterruptedException;
//当垃圾回收确定不再有对对象的引用时,由垃圾回收器在对象上调用.
protected void finalize() throws Throwable;
0.Object()
对于未定义构造函数的类,默认会有一个无参数的构造函数。因此其实Object虽然源码中没有写,但也能直接new Object()得到对象的。
1.registerNatives()
private static native void registerNatives();
static {
registerNatives();
}
参见博客:Object类中的registerNatives方法的作用深入介绍
使用registerNatives()方法的好处:
1.通过registerNatives方法在类被加载的时候就主动将本地方法链接到调用方,比当方法被使用时再由虚拟机来定位和链接更方便有效;
2.如果本地方法在程序运行中更新了,可以通过调用registerNative方法进行更新;
3.Java程序需要调用一个本地应用提供的方法时,因为虚拟机只会检索本地动态库,因而虚拟机是无法定位到本地方法实现的,这个时候就只能使用registerNatives()方法进行主动链接。
4.通过registerNatives()方法,在定义本地方法实现的时候,可以不遵守JNI命名规范。
真要详解这个,那肯定不是低级别的面试
2.getClass()
public final native Class<?> getClass();
返回的是此对象的类对象/运行时类对象Class<?>。效果与Object.class相同。
3.hashCode()
public native int hashCode();
返回一个整形数值,表示该对象的哈希码值。
注意hashCode有以下约定:
1.在java应用程序的一次执行期间,同一对象多次调用hashCode()方法,其返回的哈希码一定相同的,(前提是对象进行equals比较时所用的标尺信息不变)
2.在Java应用程序的不同执行,同一对象的hashCode()返回的哈希码可以不同;
3.相等(调用equals返回true)的两个对象的哈希值一定相同。
4.哈希值相同的两个对象可以不相等。
出于合理的实用性,Object类定义的hashCode方法确实为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的,但是Java并不需要这种实现技术。)
4.equals
public boolean equals(Object obj) {
return (this == obj);
}
判断两个对象是否“相等”。
显然这会让人想起==与equals的区别
equals方法实现了对非空对象引用的等价关系:
- 自反性:对于任意非空x, x.equals(x)应该返回true。
- 对称性:对于任意非空x和y,当且仅当y.equals(x)返回真值时,x.equals(y)应该返回真值。
- 可传递性:对于任意非空x、y和z,如果x.equals(y)返回true, y.equals(z)返回true,那么x.equals(z)应该返回true。
- 一致性:对于任意非空引用值x和y,x.equals(y)的多次调用都一致返回true或一致返回false,前提是在对象的等号比较中使用的信息没有被修改。
- 对于任意非空引用值x, x.equals(null)应该返回false。
通常有必要在重写hashCode方法时重写该方法,以便维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希码。
5.clone()
protected native Object clone() throws CloneNotSupportedException;
创建并返回此对象的副本.
是浅克隆。
首先,如果此对象的类不能实现接口 Cloneable,则会抛出CloneNotSupportedException异常
Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用clone 方法将会导致在运行时抛出异常。
6.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
返回的是类名+16进制无符号整数形式表示的哈希码。
System.out.println(obj)时,其内部也是通过toString()来实现的。
7.JUC相关方法
//唤醒在此对象监视器上等待的单个线程.
public final native void notify();
//唤醒在此对象监视器上等待的所有线程
public final native void notifyAll();
//使当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法,或经过了指定的时间。
public final native void wait(long timeout) throws InterruptedException;
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);
}
public final void wait() throws InterruptedException {
wait(0);
}
notify方法唤醒在此对象监视器上等待的单个线程,如果此监视器上有多个对象在等待,则会选择唤醒其中一个线程,选择是任意的(随机的)。
而notifyAll会唤醒所有线程。线程通过调用其中一个wait方法,在对象监视器上等待。直到当前线程放弃此对象的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与该对象上主动同步的其他所有线程进行竞争。
8.finalize()
//当垃圾回收确定不再有对对象的引用时,由垃圾回收器在对象上调用.
protected void finalize() throws Throwable;
当JVM已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非准备终止的其他某个对象或类的终结操作执行了某个操作。
对于任何给定对象,JVM最多只调用一次 finalize 方法。
总结
由于Object是java的顶层父类,其方法大多是native修饰的,同时也准备了对象的常见操作(判等,打印,获取类信息,JUC操作,回收操作)。
最后
以上就是个性吐司为你收集整理的Java中最顶层的父类是? 里面有什么方法?前言0.Object()1.registerNatives()2.getClass()3.hashCode()4.equals5.clone()6.toString()7.JUC相关方法8.finalize()总结的全部内容,希望文章能够帮你解决Java中最顶层的父类是? 里面有什么方法?前言0.Object()1.registerNatives()2.getClass()3.hashCode()4.equals5.clone()6.toString()7.JUC相关方法8.finalize()总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复