jdk源码阅读之Object类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BlingZeng/article/details/83046158

Object的作用

Object是java所有类的基类,定义了所有类的基础方法 。这个类所定义的方法也不多,大部分是native方法。

什么是native方法

native关键字标识的java方法为本地方法,底层是有c/c++编写的程序编译后dll文件,java加载dll文件后,可用通过本地方法调用dll中函数,如有疑问可用参考JNI使用方式

Object的类图

描述类图主要的目的是让我们明白我们当前所阅读的类的源代码在整个工程中的所处的位置。

Object重要方法源码解析

native方法

native方法是使用c/c++编写的程序,我们在java源码中是看不到代码的,因此对于这些类,如果不是需要深入了解,我们知道作用即可!

	static native void registerNatives()
	public final native class<?> getClass() 返回此object的运行时类
	public native int hashCode()  返回类的hash值
	protect native object clone() throws CloneNotSupportedException;  克隆,是创建类的一种方式,object的clone方法是浅复制,如果想实现深拷贝,需要自己编写clone方法
 	public final native void notify()  唤醒在此对象监视器上等待的单个线程
	public final native void notifyAll() 唤醒在此对象监视器上等待的所有线程
	public final native void wait(long timeout) throws InterruptedException;

final方法

final方法是不允许继承的子类覆盖的,换个说法,final方法是所有类都是一样的。

	public final native class<?> getClass() 返回此object的运行时类
	public final native void notify()
	public final void wait() throws InterruptedExceptiop;
	public final native void wait(long timeout) throws InterruptedException;
	final void wait(long timeout,int nanos)
	......	

所有的final方法都是native方法,不要以为“public final void wait() throws InterruptedExceptiop;”这个方法不是native方法,这个方法里面的代码只有一句:wait(0);也就是他调用的是“public final native void wait(long timeout) throws InterruptedException;”方法,所以说他也是native方法是没错的。

final方法和native方法的总结

是final方法肯定是native方法,但是是native方法不一定是final方法。
是native方法但不是final方法的方法有两个:

  1. public native int hashCode(); 自己定义hashcode值的计算,hashCode 的常规协定是: 1.在应用程序执行期间,如果一个对象用于equals()方法的属性没有被修改的话,那么要保证对该对象多次返回的hashcode值要相等。2.如果2个对象通过equals()方法判断的结果为true,那么要保证二者的hashcode值相等。3.如果2个对象通过equals()方法判断的结果为false,那么对二者hashcode值是否相等并没有明确要求。如果不相等,那么能够提升散列表的性能。
  2. protect native object clone() throws CloneNotSupportedException;克隆,是创建类的一种方式,object的clone方法是浅复制,如果想实现深拷贝,需要自己编写clone方法。在这里解释一下什么是浅复制,所谓的浅复制就是说当对象中存在引用类型的变量,浅复制是不会根据引用类型重新构建一个新的对象,然后引用的,他只会将引用类型的变量的值复制过来。通俗点来说就是:如果你改变浅复制的对象的引用类型的数据,被复制的引用类型的数据也会改动。

常用的方法

//这个方法如果不覆盖,那么就会调用object类中的toString方法,
public String toString(){
    return getClass().getName() + "@" + Integer.toHexString(hashCode());     
    } 
//比较两个对象的地址值是否相同,在这里需要说明一点的是:
//在String类中有这样一个说法:“==”是比较地址的值,equals方法是比较内容。
//这个说法是没有错的,但是忽略的一个前提条件,String类覆盖了equals方法
//我想说的一点是:如果一个类中没有覆盖equals方法,那么使用equals方法也是比较地址值的。
public boolean equals(Object obj){
	return (this == obj)
}

其他的方法

// 垃圾回收器在认为该对象是垃圾对象的时候会调用该方法。
//子类可以通过重写该方法来达到资源释放的目的。
// 在方法调用过程中出现的异常会被忽略且方法调用会被终止。 
//任何对象的该方法只会被调用一次。  
protected void finalize() 

Object 涉及的涉及模式

看了一遍源码之后,没有发现有什么设计模式

学习Object后的感想

Object是java中的所有类的基类,记得当时我学习Java的时候,对于这个类的印象是:上帝,就这两个字了。现在明白其实Object被设计出来就是让所有的类都具备一个类的必备的方法,让程序员涉及类的时候不必写这些代码(需要覆盖的除外)。明白了Object中的很多方法是使用c、c++写的,也知道了类的深浅复制,以及类的基础方法。

如有错误或不同看法,欢迎评论!或者联系我:[email protected]

猜你喜欢

转载自blog.csdn.net/BlingZeng/article/details/83046158