从头开始学JDK-------Object

目录

* Object #getClass

* Object #hashcode 

* Object #equals

* Object #toString

* Object #clone

* Object #线程相关的方法

* Object #垃圾回收


* Object #getClass

        获取每个类的字节码文件。返回Class类。static synchronize的锁就是这个类的字节码文件Class对象

        final方法,不能够被重写的方法

* 衍生 Class类可以用于反射创建无参的对象

            List<String> classCreators = new ArrayList<>();
            for (String classFullName : classNames) {
                //根据类全名生成对象
                Class<?> clazz = Class.forName(classFullName);
                classCreators.add(clazz.newInstance());
            }

* 衍生 判断某个类的Clazz是另外一个类的Clazz的衍生类

        this.getClass()返回这个类的Class文件

        field.getType()拿到的也是这个Field代表的对象的Class文件

   private List<JRadioButton> getRadios() {
        List<JRadioButton> radios = new ArrayList<>();
        try {
            Field[] fields = this.getClass().getDeclaredFields();
            for (Field field : fields) {
                if (field.getType().isAssignableFrom(JRadioButton.class)) {
                    radios.add((JRadioButton) field.get(this));
                }
            }
        } catch (Exception e) {
            throw new IllegalArgumentException("获取组件上的Radio出错!!");
        }
        return radios;
    }

* Object #hashcode 

        本地方法,public,高频重写的方法。为什么要使用String类的hashcode作为Key,因为String是不可变类,线程安全,并且hashcode在String类中有缓存功能,计算一次即可。

* Object #equals

        public,高频重写的方法。默认比较的是两个对象的引用地址。

    public boolean equals(Object obj) {
        return (this == obj);
    }

* Object #toString

        源代码中默认展示了 类的全限定名,以及它的hashcode的十六进制表示。

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

* Object #clone

        本地方法,public。源代码注释上表示如果没有实现Cloneable接口,要求抛出异常。

        根据面向对象的里氏替换原则,子类重写的时候应该要求返回一个原来对象的副本。源代码注释表示子类依旧可以抛出异常。

* Object #线程相关的方法

        wait 、 notify 、notifyAll  都是final的,不得重写。操作的锁是调用的这个对象本身

* Object #垃圾回收

        finalize ,protected属性,一般不重写,由JVM自己调用。为了迎合C++程序员做的方法。

posted @ 2022-07-17 12:13  小大宇  阅读(11)  评论(0编辑  收藏  举报