Thinking in Java-类型信息[反射]

不得不说,Java编程思想这本书对小白太不友好了,一般都不讲基本语法,这一章你如果之前对Java反射并不了解看完这一章还是不了解。建议还是 先 学学基本语法再来看这本书。网上好多人都说直接看这本书是看不懂的,一般工作两三年再看才能看懂。

  • 名词解释:

RTTI(Run-Time Type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。

使用的意义:

使用泛型+容器 时,容器会将事物当作Object持有,自动将结果转换为Shape。所有的类型转换都是在运行时进行正确性检查的。接下来如何正确的执行代码,[是多态机制]由引用控制。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TCvSgqPp-1577624207919)(BFC2B9B961864958BA0DF400CFB9A278)]

public class Shapes {
    public static void main(String[] args) {
        List<Shape> shapeList = Arrays.asList(
                new Circle(),new Square(),new Triangle()
        );
        
        for (Shape shape : shapeList){
            System.out.println(shape.draw());
        }
    }
}

Class对象

Class类的对象实现了类的类型信息的表示。用来创建类的所有常规对象

每一个类都有一个Class对象,每当编写了一个新类就会产生一个Class对象。[保存在一个同名的.class文件中],为了生成新类的对象,JVM通过使用类加载器生成。[类加载器包含一条类加载器链,只有一个原生加载器][一会就去看一下JVM那本书]。

JVM并不完全加载所有的类,所有的都编译为字节码,用到[使用它的静态成员时]的时候先检查是否加载,没有加载才会加载。

构造方法默认是static的所以new对象时也加载

加载意味着执行static代码块,static代码块只会在类加载时执行一次

使用类的准备工作
1. 加载 2. 链接 3. 初始化

// 通过这种方式获得Class的引用,需要捕获异常,因为运行时才能判断正确性
Class.forName("类名"); // 类加载执行static代码块[先父类]   

//通过 FanToy.class [类字面常量]获得Class引用不需要捕获异常,因为在编译期 编译器已经判断过正确性了
FanToy.class // 获得对象引用不会执行static,延迟到对静态方法或者非常数静态域进行首次引用时执行。[静态常数编译器就确定值了]

new 类名;  //  new 对象  先执行static代码块 再执行构造方法

Class使用泛型不需要强转[编译器确定过类型了,但是<?>super需要强转 extend不需要]

依据取决于编译器能否确定具体类型。

Instanceof[Class.isInstance]

用来判断是不是某种类型或者子类,实现类。[==、equals]只能判断Class对象是否相等。

扩展一下equals 、 == 、 HashCode的区别

equals比较对象时先判断class是否重写了equals方法,用equals方法判断相等,如果没重写就与==效果一样。

==是比较引用[地址]是否一样,hashcode相同不一定引用相同,hashcode有可能存在重复的现象。

因为equals相等时HashCode必相等,所以重写一个类的 equals 方法时就应当连同重写 hashcode 方法[这是一条规范]。

原文地址:https://www.cnblogs.com/biturd/p/12623170.html