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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李白衣 中级黑马   /  2014-3-13 16:16  /  3601 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李白衣 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

4 个回复

倒序浏览
zengming13 发表于 2014-3-14 08:42
你的加载方式是下面的哪一种?
Class c = A.class;//只是加载字节码文件,不会初始化
Class.forName("A");/ ...

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

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

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

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马