黑马程序员技术交流社区
标题: 静态成员变量在什么时候初始化? [打印本页]
作者: 李白衣 时间: 2014-3-13 16:16
标题: 静态成员变量在什么时候初始化?
本帖最后由 李白衣 于 2014-3-13 16:18 编辑
一个单例设计模式,我想问的是 静态成员变量 me 是在什么时候被赋值的,网上说是在类加载的时候,但是我用类加载器来加载Me.class的时候,并没有任何的输出内容啊???但是可以确定的是调用CreateMe方法,me被赋值是在函数执行之前。- class Me{
-
- static{
- System.out.println("loading");
- }
- private static Me me = new Me();
-
- private Me() {
- System.out.println("loaded");
- }
-
- public static Me CreateMe()
- {
- System.out.println("function");
- return me;
- }
-
- }
复制代码
作者: 李白衣 时间: 2014-3-14 09:52
哦,就是说加载字节码是一个阶段,默认初始化和显示初始化又是一个阶段。
我是用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 |