您的位置:首页 > 移动开发 > Objective-C

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

2017-12-06 16:39 561 查看
java.lang.Object

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-源码