黑马程序员技术交流社区

标题: 静态成员变量在什么时候初始化? [打印本页]

作者: 李白衣    时间: 2014-3-13 16:16
标题: 静态成员变量在什么时候初始化?
本帖最后由 李白衣 于 2014-3-13 16:18 编辑

一个单例设计模式,我想问的是 静态成员变量 me 是在什么时候被赋值的,网上说是在类加载的时候,但是我用类加载器来加载Me.class的时候,并没有任何的输出内容啊???但是可以确定的是调用CreateMe方法,me被赋值是在函数执行之前。
  1. class Me{

  2.        
  3.         static{
  4.                 System.out.println("loading");
  5.         }

  6.         private static Me me = new Me();
  7.        
  8.         private Me() {
  9.                 System.out.println("loaded");
  10.         }
  11.        
  12.         public static Me CreateMe()
  13.         {
  14.                 System.out.println("function");
  15.                 return me;
  16.         }
  17.        

  18. }
复制代码


作者: 李白衣    时间: 2014-3-14 09:52
zengming13 发表于 2014-3-14 08:42
你的加载方式是下面的哪一种?
Class c = A.class;//只是加载字节码文件,不会初始化
Class.forName("A");/ ...

哦,就是说加载字节码是一个阶段,默认初始化和显示初始化又是一个阶段。
我是用classloader加载的。
作者: 谜燕    时间: 2014-3-14 20:25
首先是静态代码块,是给类进行初始化的,然后你要创建对象,但是创建对象之前是构造函数,接下来就是创建对象,并进行初始化,再然后就是对外提供的创建对象的静态方法了。
作者: 黄飞1991    时间: 2014-3-15 09:37
对象初始化过程是这样的:
1.       首先加载类到内存中
2.       对于类变量,系统默认初始化为null或0等默认值
3.       执行静态代码块或类变量的显示初始化(代码中谁在前面谁就先执行)
4.       在堆内存中开辟空间,分配内存地址
5.       对于成员变量,首先系统默认初始化为null或者0等默认值
6.       然后执行构造代码块或成员变量显示初始化(代码中谁在前面谁就先执行)
7.       最后才是构造方法初始化
8.       将堆内存中的地址付给栈内存中的引用


作者: 孟茹    时间: 2014-3-15 10:42
静态代码块:就是一个有静态关键字标示的一个代码块区域。定义在类中。作用:可以完成类的初始化。静态代码块随着类的加载而执行,而且只执行一次(new 多个对象就只执行一次)。如果和主函数在同一类中,优先于主函数执行。。静态代码块、构造代码块、构造函数同时存在时的执行顺序:静态代码块 、 构造代码块 、 构造函数;




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