java源码阅读笔记(1)- Object
2017-12-06 16:39
561 查看
java.lang.Object
registerNatives方法
源代码:
分析:
- native关键字
表示这个方法不是用java写的,这个方法做什么用,我现在回答不了,从命名上看,是为了注册,那么是在哪里注册,注册什么东西,不清楚。
肯能是要和操作系统交流,也可能是要和JVM交流。
http://blog.csdn.net/wike163/article/details/6635321
- private 和 static
这个方法是私有的,静态的类方法。
- 静态初始化块
系统在类的初始化阶段执行静态初始化块,而不是在创建对象时才执行。因此静态初始化块总是比普通初始化块先执行。
延伸知识点:
类的初始化阶段,先执行最顶层父类的静态初始化块,然后依次向下,直到执行当前类的静态初始化块。
对象的初始化阶段,先执行最顶层父类的初始化块、最顶层的构造方法,然后依次向下,直到执行到当前类的初始化块、构造方法。
看代码:
看结果:
可以为每一个打印设置上断点,进行单步调试,就能更加清晰的看到执行顺序。
getClass()方法
源代码:
分析:
final 修饰的方法,不可重写,出于某些原因,不希望子类重写父类的某个方法,那么就可以用这个final来修饰这个方法.
注意方法的返回类型是 Class
.class 和 getClass()两者的关系?
如果你知道一个实例,那么你可以通过实例的“getClass()”方法获得该对象的类型类,
如果你知道一个类型,那么你可以使用“.class”的方法获得该类型的类型类。
获得类型类之后有什么好处?
在获得类型类之后,你就可以调用其中的一些方法获得类型的信息了,主要的方法有:
getName():String:获得该类型的全称名称。
getSuperClass():Class:获得该类型的直接父类,如果该类型没有直接父类,那么返回null。
getInterfaces():Class[]:获得该类型实现的所有接口。
isArray():boolean:判断该类型是否是数组。
isEnum():boolean:判断该类型是否是枚举类型。
isInterface():boolean:判断该类型是否是接口。
isPrimitive():boolean:判断该类型是否是基本类型,即是否是int,boolean,double等等。
isAssignableFrom(Classcls):boolean:判断这个类型是否是类型cls的父(祖先)类或父(祖先)接口。
getComponentType():Class:如果该类型是一个数组,那么返回该数组的组件类型。
http://blog.csdn.net/qianzhiyong111/article/details/7320879
看代码:
看结果:
hashCode()方法
源代码:
equals(Object obj) 方法
源代码:
toString() 方法
源代码:
分析: 官方建议都重写这个方法。
与线程通信相关的方法
分析:
finalize()方法
分析:
http://www.jianshu.com/p/9d2788fffd5f
建议:尽量不要使用finalize,除非以它作为安全网,或是为了终结非关键的原生资源。
finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。
特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。
使用finalize还需要注意一个事,调用super.finalize();
一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。
所以,推荐不要使用finalize()方法,它跟析构函数不一样。
克隆方法
源码:
分析:
registerNatives方法
源代码:
private static native void registerNatives(); static { registerNatives(); }
分析:
- native关键字
表示这个方法不是用java写的,这个方法做什么用,我现在回答不了,从命名上看,是为了注册,那么是在哪里注册,注册什么东西,不清楚。
肯能是要和操作系统交流,也可能是要和JVM交流。
http://blog.csdn.net/wike163/article/details/6635321
- private 和 static
这个方法是私有的,静态的类方法。
- 静态初始化块
系统在类的初始化阶段执行静态初始化块,而不是在创建对象时才执行。因此静态初始化块总是比普通初始化块先执行。
延伸知识点:
类的初始化阶段,先执行最顶层父类的静态初始化块,然后依次向下,直到执行当前类的静态初始化块。
对象的初始化阶段,先执行最顶层父类的初始化块、最顶层的构造方法,然后依次向下,直到执行到当前类的初始化块、构造方法。
看代码:
class ExA{ static { System.out.println("父类--静态代码块"); } public ExA() { System.out.println("父类--构造函数"); } { System.out.println("父类--非静态代码块"); } } class ExB extends ExA{ static { System.out.println("子类--静态代码块"); } public ExB() { System.out.println("子类--构造函数"); } { System.out.println("子类--非静态代码块"); } } public class TestStaticInit { public static void main(String[] args) { new ExB(); } }
看结果:
可以为每一个打印设置上断点,进行单步调试,就能更加清晰的看到执行顺序。
getClass()方法
源代码:
public final native Class<?> getClass();
分析:
final 修饰的方法,不可重写,出于某些原因,不希望子类重写父类的某个方法,那么就可以用这个final来修饰这个方法.
注意方法的返回类型是 Class
.class 和 getClass()两者的关系?
如果你知道一个实例,那么你可以通过实例的“getClass()”方法获得该对象的类型类,
如果你知道一个类型,那么你可以使用“.class”的方法获得该类型的类型类。
获得类型类之后有什么好处?
在获得类型类之后,你就可以调用其中的一些方法获得类型的信息了,主要的方法有:
getName():String:获得该类型的全称名称。
getSuperClass():Class:获得该类型的直接父类,如果该类型没有直接父类,那么返回null。
getInterfaces():Class[]:获得该类型实现的所有接口。
isArray():boolean:判断该类型是否是数组。
isEnum():boolean:判断该类型是否是枚举类型。
isInterface():boolean:判断该类型是否是接口。
isPrimitive():boolean:判断该类型是否是基本类型,即是否是int,boolean,double等等。
isAssignableFrom(Classcls):boolean:判断这个类型是否是类型cls的父(祖先)类或父(祖先)接口。
getComponentType():Class:如果该类型是一个数组,那么返回该数组的组件类型。
http://blog.csdn.net/qianzhiyong111/article/details/7320879
看代码:
package atos.fkjava.book07; public class TestgetClass { public static void main(String[] args) { Father son1=new Son1(); Father son2=new Son2(); System.out.println(Father.class); readClassInfo(son1); readClassInfo(son2); } public static void readClassInfo(Father f) { System.out.println(f.getClass()); System.out.println(f.getClass().getName()); System.out.println(f.getClass().getSimpleName()); System.out.println("=========="); } } class Son1 extends Father { } class Son2 extends Father { } class Father { }
看结果:
class atos.fkjava.book07.Father class atos.fkjava.book07.Son1 atos.fkjava.book07.Son1 Son1 ========== class atos.fkjava.book07.Son2 atos.fkjava.book07.Son2 Son2 ==========
hashCode()方法
源代码:
public native int hashCode();
equals(Object obj) 方法
源代码:
public boolean equals(Object obj) { return (this == obj); }
toString() 方法
源代码:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
分析: 官方建议都重写这个方法。
与线程通信相关的方法
public final native void notify(); public final native void 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); }
分析:
finalize()方法
protected void finalize() throws Throwable { }
分析:
http://www.jianshu.com/p/9d2788fffd5f
建议:尽量不要使用finalize,除非以它作为安全网,或是为了终结非关键的原生资源。
finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。
特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。
使用finalize还需要注意一个事,调用super.finalize();
一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。
所以,推荐不要使用finalize()方法,它跟析构函数不一样。
克隆方法
源码:
protected native Object clone() throws CloneNotSupportedException;
分析:
相关文章推荐
- 源码阅读笔记:java.lang.Object
- java.lang.Object源码阅读笔记
- Java Jdk1.8 HashMap源码阅读笔记一
- java基础集合源码阅读笔记
- Java框架类源码阅读学习笔记
- JAVA 集合类(java.util)源码阅读笔记------ArrayList
- Java Jdk1.8 HashMap源码阅读笔记二
- Android源码分析:Java的Media Scanner层(阅读笔记)
- JAVA 集合类(java.util)源码阅读笔记------HashMap
- java.lang.String源码阅读笔记
- java集合源码阅读笔记-HashMap
- 源码阅读笔记1————从Object开始
- Java Collection Framework 源码阅读笔记
- JAVA 集合类(java.util)源码阅读笔记------Hashtable
- JAVA 集合类(java.util)源码阅读笔记------LinkedList
- Three.js源码阅读笔记(Object3D类)
- java并发包源码阅读笔记(1)-AQS源码研究
- JAVA 集合类(java.util)源码阅读笔记------Vector
- Java集合源码阅读笔记(1)
- JAVA 集合类(java.util)源码阅读笔记------Stack