从零开始的JDK之旅 day01

朱小落

关注

阅读 79

2021-09-25

万物皆对象(类)

  在看Object类源码的时候,会发现里面好多被native关键字修饰的方法。那么native这个关键字是什么意思呢?

  被native关键字修饰的方法表示这个方法不是在java中实现的,而是由其他语言(c语言或c++或汇编)编写的,
  并且被编译成.dll,可以由java直接去调用。

源码中第一个由native修饰的方法就是registerNatives()方法

    private static native void registerNatives();
    static {
        registerNatives();
    }

registerNatives()方法在静态代码块中被调用,这也就是说当类第一次被加载的时候就会调用这个方法,并且只会调用一次。

registerNatives()方法有什么用呢?

native方法

getClass()方法:获取当前类的Class类型对象,内存中的Class对象,通过这个对象可以获取当前类的的所有信息。这个方法等价于类名.class。相当于直接拿到.class文件。

        Person p1 = new Person("abc",10);
        Class clazz = p1.getClass();
        clazz.getName();
        System.out.println(Person.class == clazz); // true

hashCode()方法:返回当前类的hashCode()码。
clone()方法:

public class ObjectDemo implements Cloneable{
    public static void main(String[] args) throws CloneNotSupportedException {
        //3、 clone方法  protected 被保护的 访问权限是同一个包下或者其子类
        ObjectDemo od = new ObjectDemo();
        ObjectDemo clone = (ObjectDemo) od.clone();
        System.out.println(od);
        System.out.println(clone);
        System.out.println(od == clone);
    }
}

notify()方法:随机唤醒一个线程
notifyAll()方法:唤醒所有线程
wait(long timeout)方法:让线程进入等待状态,直到其他线程通过notify()方法或notifyAll()方法唤醒,该方法只能在同步方法中调用。
wait()方法:内部调用重载方法wait(0)。

finalize()方法:finalize()方法只会被调用一次,用于GC在垃圾回收前判断对象要不要回收,再次执行GC的时候不会执行这个方法,只会执行一次。

非native方法

equals(Object obj)方法:比较两个对象是否相同。

toString()方法:toSting()方法就是将当前对象装换成String字符串。
Object类中打印的是:
getClass().getName() + "@" + Integer.toHexString(hashCode())

因为Object是所有类的超类,所以任何类都可以按自己的要求重写equals(Object obj)方法 和 toString()方法。

精彩评论(0)

0 0 举报