java源码阅读笔记(1)- Object

java.lang.Object

  1. 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();
    }

}

看结果:
这里写图片描述

可以为每一个打印设置上断点,进行单步调试,就能更加清晰的看到执行顺序。

  1. 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
==========
  1. hashCode()方法
    源代码:
public native int hashCode();
  1. equals(Object obj) 方法
    源代码:
    public boolean equals(Object obj) {
        return (this == obj);
    }
  1. toString() 方法
    源代码:
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

分析: 官方建议都重写这个方法。

  1. 与线程通信相关的方法
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);
    }

分析:

  1. 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()方法,它跟析构函数不一样。

  1. 克隆方法
    源码:

    protected native Object clone() throws CloneNotSupportedException;

    分析:
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值