首页 > 学院 > 开发设计 > 正文

第十四章 类型信息

2019-11-08 19:59:27
字体:
来源:转载
供稿:网友

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 ref47Initializing Initable258Initializing Initable2147Initializing Initable3After creating Initable3 ref74

该程序的解释详见p353页


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表