A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 夜空闪亮 于 2013-8-2 18:59 编辑

一旦类被加载进内存,则首先执行静态代码块,其次执行构造代码块,最后执行构造函数.
可是这段代码我却搞不明白.
  1. class  StaticDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Demo d = null;
  6.                 System.out.println("*********"+Demo.class);
  7.                 System.out.println("*********");

  8.         }
  9. }

  10. class Demo
  11. {
  12.         static
  13.         {
  14.                 System.out.println("Demo run");
  15.         }
  16. }
复制代码
上述代码只是定义了一个Demo类的引用,但并未通过new来创建对象,请问此时Demo类到底有没有加载入内存?
若没有,为什么输出Demo.class不报错;若已加载入内存,为什么静态代码块却又没有执行??
求高手解答!!

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

11 个回复

倒序浏览
Demo d =null;//这一句中已经加载了Demo类
回复 使用道具 举报
王靖远 发表于 2013-8-2 17:11
Demo d =null;//这一句中已经加载了Demo类

既然已经加载了Demo类,那为什么此程序运行结果中不打印Demo run呢?说明了Demo类中的静态代码块并没有执行啊!静态代码块不是类一加载入内存就要执行吗?
回复 使用道具 举报
共有三种产生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 getClass()
  可以通过任何实例对象来引用该方法来获取相应的Class对象。使用此种方式的前提是我们需要产生相应的实例对象。
  3.类名.class 此种方式产生Class对象较前两种简单,无需第一种还要进行异常处理(在编译期就进行错误的检查了)。此种方式不会自动初始化该Class对象。初始化被延迟到对静态方法(包括构造方法)或非常数静态域进行首次引用时才进行。

评分

参与人数 2技术分 +1 黑马币 +5 收起 理由
夜空闪亮 + 5 很给力!
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
夜空闪亮 发表于 2013-8-2 17:22
既然已经加载了Demo类,那为什么此程序运行结果中不打印Demo run呢?说明了Demo类中的静态代码块并没有执行 ...

Demo.class这句也是将类的字节码加载进内存也没有打印静态代码块中的内容啊。这是加载类的字节码。只有给对象初始化的时候才会执行构造代码块吧。Demo d  = null;这句话只是把Demo类的字节码加载进内存中。
这是我的理解不知道对不对。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
我也同求这问题。。想不通到底加载没有
回复 使用道具 举报
本帖最后由 田磊阳 于 2013-8-2 18:25 编辑

类名.class只会加载类,不会执行静态初始化,记住就好了

Demo.class只会加载类,不会执行静态代码块,与Demo d = null没关系


Class.forName也会倒致类的加载,但是它们是有区别的Class.forName会倒致类的静态初始化,但类名.class只会加载类,不会执行静态初始化(有父类的话先加载父类的)

评分

参与人数 2技术分 +1 黑马币 +4 收起 理由
夜空闪亮 + 4 很给力!
杨兴庭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼上正解。。。。。{:soso_e179:}
回复 使用道具 举报
田磊阳 发表于 2013-8-2 18:17
类名.class只会加载类,不会执行静态初始化,记住就好了

Demo.class只会加载类,不会执行静态代码块,与De ...

给力啊。之前还真知道forName加载会静态初始化
回复 使用道具 举报
谢谢各位大神的回答{:soso_e183:},我明白了!!
回复 使用道具 举报
Demo.class 不是对类的主动使用,所以此时不会使类初始化。却可以得到class对象。类是已加载了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马