美文网首页
Java编程思想(十一)

Java编程思想(十一)

作者: MikeShine | 来源:发表于2019-05-21 21:33 被阅读0次

    第14 章 类型信息

    RTTI(Run Time Type Identification)运行时类型信息使得我们可以在程序运行时发现和使用类型信息。

    这一章会讨论 java 中关于运行时类型的一些问题。比如我们怎样获取类型,判断类型,进行类型转换等。

    14.1 为什么需要RTTI

    不太懂书上这里说的是什么意思。
    这里给了前面多态的例子,基类 Shape() 和其 导出类 Circle()、Triangle()、Square(),这时候,使用 RTTI,可以查询某个 Shape 引用所指向的对象的确切类型

    14.2 Class 对象

    这里的这个不是 class 关键字了。这里的 Class 本来就是一个类,而在这个类中,就包含了大量使用RTTI的其他方式。
    这里书上首先给出了一些理论性的概念,每个类都有一个Class对象
    所有的类都是在对其第一次使用时,动态加载到 JVM中的。当程序创建第一个对类的静态成员引用时,就会加载这个类(所以类的构造函数是 static 的)。
    所以,Java程序在运行之前并不是完全加载的。
    这里书上给出了一个例子来说明程序加载的顺序

    package typeinfo;
    
    class Candy{
        // 静态子句
        static {System.out.println("Loading Candy");}
    }
    
    class Gum{
        static {System.out.println("Loading Gum");}
    }
    
    class Cookie{
        static {System.out.println("Loading Cookie");}
    }
    
    public class SweetShop {
        public static void main(String args[]){
            System.out.println("inside main()");
            new Candy();
            System.out.println("After creating Candy");
            try{
                Class.forName("Candy");
            }catch (ClassNotFoundException e){
                System.out.println("cannot find class");
            }
            new Gum();
            System.out.println("After creating Gum");
        }
    }
    

    其中,类中都写了静态子句,如果类被加载就会执行静态子句。
    之后,作者通过一个例子给出了Class包含的很多方法。

    • getName():包含包名
    • getSimpleName() : 直接是类名
    • getcononicalName() :包含包名(路径)
    • isInterface():
    • getSuperClass()
      等等等等。
    14.2.1 类字面常量

    java 提供用类字面常量来生成对 Class 对象的引用。

    class Initable{}
    // 用 类字面常量生成引用
    Class duixiang = Initable.class;
    // 也可以用 forName()方法生成引用
    Class duixiang2 = Class.forName("Initable");
    

    作者给出了一个例子,说明二者存在一定的区别,前者不会加载类(初始化),而后者会。

    14.2.2 泛化的 Class 引用

    不懂

    14.2.2 新的转型语法

    就是说这里的 Class 对象有一个 cast() 方法,将参数转换成为调用方法的对象的类型.

    Class zhaunxing = House.class;
    Building b;
    House house = zhuanxing.cast(b);
    // 上面的代码等价于
    house = (House)b;
    

    这个cast()方法极其少用,知道有这个玩意就行了。

    14.3 类型转换前先做检查

    这里书上说,目前已知的 RTTI形式包括了:

    • 传统类型转换:(int)a
    • 代表对象类型的Class对象,我们前面刚说过
    • instanceof 关键字
    if(x instanceof Dog)
      x.bark();
    

    14.4 注册工厂

    之前我们说过,工厂就是用来专门生产接口对象的,其中的 工厂方法就是生产对象的方法。
    这里的大概意思是说,工厂方法返回类型是固定的,所以对于不同类要写不同的方法,而这里用 泛型 ,就可以写一个工厂方法来适用。

    // 这里的T是  泛型参数
    public interface Factory<T> {T create();}
    

    14.5 instanceof 和 Class 的等价性

    二者基本一样,但是书上说了一下 eqals() 和 == 的区别:

    • == 是 比较存放对象的地址
    • equlas() 是用来比较两个对象的内容

    相关文章

      网友评论

          本文标题:Java编程思想(十一)

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