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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 XiaoS 于 2014-1-6 07:50 编辑
  1. class DemoSingle {
  2. public static void main (String[] args){
  3. Single s1 = Single.s;
  4. System.out.println("s1 = "+s1);
  5. }
  6. }

  7. //定义Single类
  8. class Single {

  9. //私有化构造函数
  10. private Single(){}

  11. //创建一个本类对象
  12. static Single s = new Single();
  13. }
复制代码

我把上面的代码改成下面的话,输出结果就变成了:Single@36db4bcf为什么呢?难道不一样吗,区别在哪里呢?

  1. class DemoSingle {
  2. public static void main (String[] args){
  3. System.out.println(Single.s);
  4. }
  5. }

  6. //定义Single类
  7. class Single {

  8. //私有化构造函数
  9. private Single(){}

  10. //创建一个本类对象
  11. static Single s = new Single();
  12. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

3 个回复

倒序浏览
我猜测你可能是第一段编译运行
然后修改为第二段代码在编译运行
注意启动了两次JVM,那么每次给对象在堆内存中分配的地址可能不同

Single@36db4bcf: @后面是由内存地址换算的哈希值
那么你可以对第一段程序多运行几次,你会发现该值可能发生改变.

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
张洪慊 发表于 2014-1-6 00:19
我猜测你可能是第一段编译运行
然后修改为第二段代码在编译运行
注意启动了两次JVM,那么每次给对象在堆内存 ...

谢谢,是编译的问题!
回复 使用道具 举报
完全一样
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马