JR 精品文章 - Class对象的作用与产生
AD: jr (at) javaresearch.org


首页 | 动态 | 文章 | FAQ  | 新闻 | 下载 | 代码 | 工作 | 调查 | 术语 | 站点 | 图书 | 论坛 | 帮助 | 全部  

TOP | 交流 | 软件 | 专栏 | 开源 | 译/著 | 源码 | API  | 推荐 | FTP  | 积分 | 统计 | 搜索 | Blog | 我们  
首页 » 研究文集 » Java入门 搜索标题相关文章 搜索标题相关文章    评论此文章 发表评论     开始监控此文章 开始监控   加入收藏夹  加入收藏夹
Class对象的作用与产生
xinglongbing 整理   更新:2008-04-30 00:28:27  版本: 1.0   

  Class对象是用来创建类的常规对象的,当我们编译一个Java类就会同时产生一个与该类相对应的Class对象(保存在.class文件中)。该Class对象中保存了创建对象所需的所有信息。
共有三种产生Class对象的方法下面分别说明之:
1.public static Class<?> Class.forName("完整的类名") throws ClassNotFoundException;
  public static Class<?> forName(String name, boolean initialize,
                       ClassLoader loader) throws ClassNotFoundException
  假若我们用Class.forName("");的方式获取Class对象,其实就相当于Class.forName("完整类名", true, this.getClass().getClassLoader())也就是说在默认情况下在产生Class对象的同时会对该Class对象进行初始化(若以前没有初始化过)。

2.public final Class<? extends Object> getClass()
  可以通过任何实例对象来引用该方法来获取相应的Class对象。使用此种方式的前提是我们需要产生相应的实例对象。

3.类名.class 此种方式产生Class对象较前两种简单,无需第一种还要进行异常处理(在编译期就进行错误的检查了)。此种方式不会自动初始化该Class对象。初始化被延迟到对静态方法(包括构造方法)或非常数静态域进行首次引用时才进行。

import java.util.*;
  
class Initable{
  static final int staticFinal = 47;
  static final int staticFinal2 = ClassInitialization.rand.nextInt(100);
  static{
    System.out.println("Initialization Initable");
  }
}

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

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

public class ClassInitialization
{
  public static Random rand = new Randdom(47);
  public static void main(String[] args){
    Class initable = Initable.class;  //不会引起初始化
    System.out.println("after creating Initable reference");
    System.out.println(Initable.staticFinal);  //引用编译器常量不会引起初始化
    System.out.println(Initable.staticFinal2);  //引起初始化
    System.out.println(Initable2.staticNoFinal);  //引用非编译期常量会引起初始化

    Class initable3 = Class.forName("Initable3");  //默认会引起初始化
    System.out.println("after creating Initable3 reference");
    System.out.println(Initable3.staticNoFinal);//前面已经初始化此处不用再初始化               
  }
}

输出结果:
after creating Initable reference
47
Initialization Initable
258
Initialization Initable2
147
Initialization Initable3
after creating Initable3 reference
74
  
如果一个static final值是编译期常量,那么对该值的引用无需对其所在类进行初始化;若仅仅是static和final但不是编译期常量,则会引发初始化其类。若是引用一个static值则要进行链接并对其所在类进行初始化。













版权声明  
本篇文章对您是否有帮助?  投票:         投票结果:     23       0
作者其它文章: 作者全部文章
评论人:bluemaple_00 发表时间: Mon May 12 17:11:18 CST 2008
good ~~~
Collect~~~

这个文章共有 1 条评论
主题: 分页简介 上一篇文章
返回文章列表 返回〔Java入门〕
下一篇文章 主题: 超长整数加法算法实现(不调用java.math.*;)


文字广告链接
        自主、快速定制基于JAVA的B/S业务系统          重量级企业在线自定义WEB报表平台
        Excel制表、零代码发布、打印、图表结合——快逸报表,免费、稳定、功能强大的java工具
        技术圈: 关于Java、dotNet、PHP、Ruby、奇客、Web2.0等更多资讯博客精选文章

关于 JR  |  版权声明  |  联系我们 

©2002-2006 JR 版权所有 沪ICP备05019622号