第十四章 类型信息

1、每个类都有一个class对象,每当编写并且编译了一个 新类,就会产生一个class对象,更恰当的说,是被保存在一个同名的.class文件中,为了生成这个类对象,运行这个程序的java虚拟机jvm将使用被称为类加载器的子系统。所有类都是在对其第一次使用时,动态加载到jvm中的,当程序创建第一个对类的静态成员的引用时,就会加载这个类。

2、类的构造器也是静态方法,即使在构造器前面并没有使用static关键字,因此,用new关键字调用构造方法时也会加载这个类

3、类加载器首先检查这个Class对象是否已经加载,如果尚未加载,默认的类加载器就会根据类名查找.class 文件,在这个类的字节码被加载时,它们会接受验证,以确保没有被破坏,并且不包含不良java代码

4、Class的forName方法时取得Class对象的引用的一种方法,对forName的调用时为了它产生的副作用,如果某个类还没有被加载就加载它,在加载的过程中,static字句被执行

5、Class类的getName方法:获取类的全名(包含包名),getSimpleName方法:获取简称(不包含包名,只是类名),isInterface方法:判断类是否是interface,getInterfaces方法:获取类的所有接口

6、用Class.forName.newInstance的方式来创建一个Class的对象时,Class必须带有一个默认的构造器,否则无法知道应该调用哪一个构造器来初始化Class对象

7、java还提供了另一种方式来生成对class对象的引用,即:类字面常量    FacyToy.class 。类字面常量不仅可以应用于普通类,也可以用于接口,数组以及基本数据类型。另外,对于基本数据类型的包装类,还有一个标准字段TYPE。boolean.class 等价于Boolean.TYPE。当使用.class来创建对Class对象的引用时,不会自动的初始化该Class对象。

8、为了使用类而做的准备工作有如下三步:

  1)、加载:这是由类加载器执行的,该步骤查找字节码(从class文件中),并从字节码中创建一个Class对象

  2)、链接:在链接阶段将验证字节码,为静态域分配存储空间,并且如果必须的话,将解析这个类创建的对其他类的所有引用

  3)、初始化:如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化快。初始化被延迟到了对静态方法(构造器隐式的是静态的)或者非常数静态域进行首次引用时才执行


示例程序:


class Initable {
  static final int staticFinal = 47;
  static final int staticFinal2 =
    ClassInitialization.rand.nextInt(1000);
  static {
    System.out.println("Initializing Initable");
  }
}


class Initable2 {
  static int staticNonFinal = 147;
  static {
    System.out.println("Initializing Initable2");
  }
}


class Initable3 {
  static int staticNonFinal = 74;
  static {
    System.out.println("Initializing Initable3");
  }
}


public class ClassInitialization {
  public static Random rand = new Random(47);
  public static void main(String[] args) throws Exception {
    Class initable = Initable.class;
    System.out.println("After creating Initable ref");
    // Does not trigger initialization:
    System.out.println(Initable.staticFinal);
    // Does trigger initialization:
    System.out.println(Initable.staticFinal2);
    // Does trigger initialization:
    System.out.println(Initable2.staticNonFinal);
    Class initable3 = Class.forName("Initable3");
    System.out.println("After creating Initable3 ref");
    System.out.println(Initable3.staticNonFinal);
  }
} /* Output:
After creating Initable ref
47
Initializing Initable
258
Initializing Initable2
147
Initializing Initable3
After creating Initable3 ref
74


该程序的解释详见p353页






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值