黑马程序员技术交流社区

标题: 在学习静态代码块时遇到的问题,求大神解决 [打印本页]

作者: 夜空闪亮    时间: 2013-8-2 16:58
标题: 在学习静态代码块时遇到的问题,求大神解决
本帖最后由 夜空闪亮 于 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不报错;若已加载入内存,为什么静态代码块却又没有执行??
求高手解答!!

作者: 王靖远    时间: 2013-8-2 17:11
Demo d =null;//这一句中已经加载了Demo类
作者: 夜空闪亮    时间: 2013-8-2 17:22
王靖远 发表于 2013-8-2 17:11
Demo d =null;//这一句中已经加载了Demo类

既然已经加载了Demo类,那为什么此程序运行结果中不打印Demo run呢?说明了Demo类中的静态代码块并没有执行啊!静态代码块不是类一加载入内存就要执行吗?
作者: zhouchao    时间: 2013-8-2 17:55
共有三种产生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对象。初始化被延迟到对静态方法(包括构造方法)或非常数静态域进行首次引用时才进行。
作者: 王靖远    时间: 2013-8-2 18:02
夜空闪亮 发表于 2013-8-2 17:22
既然已经加载了Demo类,那为什么此程序运行结果中不打印Demo run呢?说明了Demo类中的静态代码块并没有执行 ...

Demo.class这句也是将类的字节码加载进内存也没有打印静态代码块中的内容啊。这是加载类的字节码。只有给对象初始化的时候才会执行构造代码块吧。Demo d  = null;这句话只是把Demo类的字节码加载进内存中。
这是我的理解不知道对不对。
作者: 倪大叶    时间: 2013-8-2 18:07
我也同求这问题。。想不通到底加载没有

作者: 田磊阳    时间: 2013-8-2 18:17
本帖最后由 田磊阳 于 2013-8-2 18:25 编辑

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

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


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


作者: 杨兴庭    时间: 2013-8-2 18:32
楼上正解。。。。。{:soso_e179:}
作者: 王靖远    时间: 2013-8-2 18:38
田磊阳 发表于 2013-8-2 18:17
类名.class只会加载类,不会执行静态初始化,记住就好了

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

给力啊。之前还真知道forName加载会静态初始化
作者: 夜空闪亮    时间: 2013-8-2 18:51
谢谢各位大神的回答{:soso_e183:},我明白了!!
作者: 影响力147753321    时间: 2013-8-2 18:52
Demo.class 不是对类的主动使用,所以此时不会使类初始化。却可以得到class对象。类是已加载了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2