从零开始的JDK之旅 day01

2020-10-22  本文已影响0人  从零开始的程序猿生活

万物皆对象(\color{blue}{Object}类)

Object类是所有类的父类,所有类默认都继承Object类。

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

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

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

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

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

静态代码块:静态代码块在类进行初始化的时候被执行,并且只会被执行一次,由JVM保证只执行一次,如果一个类中有多个静态代码块,按静态代码块的代码顺序执行。

registerNatives()方法有什么用呢?

本地方法的实现是由其他语言编写并保存在动态连接库中,因此在java类中不需要实现。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);
    }
}

\color{red}{注意:}如果要使用clone方法,那个这个类必须实现Cloneable接口才可以,否则会抛出java.lang.CloneNotSupportedException异常。

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

\color{red}{注意:}wait(long timeout) 超过timeout时间会醒来,但如果timeout为0则不考虑实时,线程一直等待直到通知。

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

非native方法

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

两个对象之间比较 p1 == p2
比较的是p1 和 p2 的内存地址(\color{blue}{两个对象在内容中的首地址}
在字符串的equals(Object anObject)方法中:比较的是内容是否相同。

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

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

上一篇下一篇

猜你喜欢

热点阅读