美文网首页
从零开始的JDK之旅 day01

从零开始的JDK之旅 day01

作者: 从零开始的程序猿生活 | 来源:发表于2020-10-22 21:21 被阅读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()方法。

    相关文章

      网友评论

          本文标题:从零开始的JDK之旅 day01

          本文链接:https://www.haomeiwen.com/subject/ecppmktx.html