Object类源码解读
其他
2018-07-22 05:14:59
阅读次数: 0
一、源码解读
package java.lang;
//所有类的父类或者祖宗类
public class Object {
private static native void registerNatives();
//类被加载时只执行一次,用于初始化静态变量和调用静态方法。
static {
registerNatives();
}
//返回该对象的运行时类(也就是形容的类的类),便于进行反射操作,进行动态加载指定的类等操作。
public final native Class<?> getClass();
//返回用该对象的内部地址转换成的一个整数(散列值),也就是该对象的哈希码。
//不同的对象,它的哈希码应该是不一样的,同一个对象再一次运行中,哈希码应该是一样的,同一个对象在不同的时间运行,哈希码可能是不一样的。
public native int hashCode();
//判断两个对象的的hashcode(哈希码)是否相等,相等则返回true,反之返回false
//如果需要通过判断对象中的属性是否相等来判断相等或者通过其它来判断相等,子类需要重写该方法
public boolean equals(Object obj) {
return (this == obj);
}
//该方法用于浅拷贝对象,一般在原型模式(prototype)时使用,但是,在原型模式时还需要让被拷贝的对象实现Cloneable接口才能调用该方法进行拷贝。
protected native Object clone() throws CloneNotSupportedException;
//用于显示该对象的内容,一般子类需要重写该方法,让对象输出符合要求和更加美观
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
//唤醒等待队列中的一个等待线程(根据各种算法来获得最着急被唤醒线程)
public final native void notify();
//唤醒等待队列中的所有等待线程
public final native void notifyAll();
//导致线程进入等待状态,直到它被其它线程使用notify()方法或者notifyAll()方法唤醒或者等待时间到为止,该方法只能在同步方法中被调用。
public final native void wait(long timeout) throws InterruptedException;
/**
* timeout - 要等待的最长时间(以毫秒为单位)。
* nanos - 额外时间(以毫微秒为单位,范围是 0-999999)
* 超时时间=1000000*timeout+nanos(毫微秒)。
*
*/
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);
}
//导致线程进入等待状态,直到它被其它线程使用notify()方法或者notifyAll()方法唤醒为 止,该方法只能在同步方法中被调用。
public final void wait() throws InterruptedException {
wait(0);
}
//用于释放资源(回收对象),无法知道什么时候该调用该方法,所以很少使用该方法。
//一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用该方法。并且在下一次垃 圾回收动作发生时,才会真正回收对象占用的内存。
protected void finalize() throws Throwable { }
}
二、注意点
1、本人就是将方法给予一些中文注解
2、native关键字
(1)JNI调用C流程
下图转载自某位大佬博客,如果侵权,请联系我,本人马上删除,感谢
(2)native(JNI Java Native Interface(Java本地接口))关键字解析:
①native是与C++联合开发的时候用的。
②使用native关键字修饰的方法,表示该方法是原生函数,也就是该方法是用 C/C++语言实现的,并且被编译成了DLL,java只是去调用了而已。
③Java其实就是在不同的平台上调用不同的native方法去实现对操作系统的访问。
④native关键字的函数都是操作系统实现的,java只能调用。
⑤native关键字修饰的方法让Java能够访问到操作系统,拓展了java的功能。
(3)在Java程序中使用c语言的方法,其实现步骤:
1、在Java中声明native()方法,然后编译;
2、用javah指令产生一个.h文件;
3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);
4、将第三步的.cpp文件编译成动态链接库文件;
5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个 native()方法就可以在Java中被访问了。
2、static块的作用:在类被加载时只执行一次,一般用于初始化静态变量和调用静态方 法。
3、类加载:虚拟机通过输入流,从磁盘上将字节码文件(.class文件)中的内容读入虚拟 机,并保存起来的过程。
类加载的特性: (1)虚拟机的生命周期中一个类只被加载一次。
(2)虚拟机的空间有限,一般都会延迟加载,能少加载就少加载。
(3)类加载时机:1)第一次创建对象要加载类。
2)调用静态方法时要加载类,访问静态属性时会加载类。
3)加载子类时必定会先加载父类。
4)创建对象引用不加载类。
5)子类调用父类的静态方法时,
(1)当子类没有覆盖父类的静态方法时,只加载父类,不加载子类。
(2)当子类有覆盖父类的静态方法时,既加载父类, 又加载子类。
6)访问静态常量,如果编译器可以计算出常量的值,则 不会加载类,例如:public static final int a =123;否则会加载类,例如:public static final int a = math.PI。
转载自blog.csdn.net/tree_ifconfig/article/details/81079483