楼主: asdxxxyah

[原创] 过了SCJP还是没看懂这题,真的很菜,谁能告诉我?3Q

[复制链接]
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
11#
发表于 2009-1-10 22:35 | 只看该作者
原帖由 asdxxxyah 于 2009-1-10 22:31 发表
Sky-Tiger
天王盖地虎  我相信你的答案,能具体说说他的执行流程吗,你只说的太简单我没明白这程序的流程

参考一下类静态成员初始化的次序吧! JVM虚拟机规范上有描述!

使用道具 举报

回复
论坛徽章:
0
12#
 楼主| 发表于 2009-1-10 22:46 | 只看该作者
Sky-Tiger
天王盖地虎

发2帖你都回答的太模糊,我不满意啊

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
13#
发表于 2009-1-10 22:50 | 只看该作者
原帖由 asdxxxyah 于 2009-1-10 22:46 发表
Sky-Tiger
天王盖地虎

发2帖你都回答的太模糊,我不满意啊

使用道具 举报

回复
论坛徽章:
0
14#
 楼主| 发表于 2009-1-10 23:03 | 只看该作者
这题目说说具体流程吧,怎么会1个变了1个没变

public static int count2=0;
又重新将private Sig()函数中的赋值清零了!

你的意思是private static Sig sig=new Sig();时构造方法执行,然后才执行变量的,是这意思吧......

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
15#
发表于 2009-1-10 23:29 | 只看该作者
原帖由 asdxxxyah 于 2009-1-10 23:03 发表
这题目说说具体流程吧,怎么会1个变了1个没变

public static int count2=0;
又重新将private Sig()函数中的赋值清零了!

你的意思是private static Sig sig=new Sig();时构造方法执行,然后才执行变量的,是这意思吧......

static Sig sig 也是静态变量啊

使用道具 举报

回复
论坛徽章:
0
16#
 楼主| 发表于 2009-1-10 23:55 | 只看该作者
我疯了,确实不知道,快告诉我具体流程,不然杀了你

使用道具 举报

回复
论坛徽章:
3
生肖徽章2007版:牛
日期:2008-09-25 19:22:372009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:狗
日期:2009-01-14 14:14:37
17#
发表于 2009-1-11 13:30 | 只看该作者
这题出的无法容忍了!!

首先,类在加载的时候就把静态变量全部初始化了,第一步就是实例化Sig:

     private static Sig sig=new Sig();

     a、这里首先将Sig类实例化,对象生成在堆中,其引用被定义为了静态类型,存储在静态堆中,而该类中,还有两个变量要初始化:
          -->public static int count1;
               public static int count2 = 0;

     不管count1有没有显式的初始化,都会根据int类型直接初始化成相应的默认初始化值,及0。而count2会被直接初始化成0;
     注意:此时这两个变量count1和count2已经被定义好了,放在静态堆中,而且以后再次使用它们,不管生成几个对象,都将指向这两个值

     b、又因为实例化对象的时候,需要调用构造函数,所以

          count1++;
          count2++;

          被执行了,这个时候coun1 = count2 = 1

紧接着,(注意,类的加载工作还没完成)还有两个静态变量需要初始化,count1和count2,而在刚才的过程中,count1和count2已经存在了,所以只需要按照赋值语句去赋值就ok了(这里将不存在初始化的概念,因为前面在生成sig对象的时候已经将这两个变量初始化了),那么既然如此,count1就没因为没有显式的赋值而忽略了,只有count2被重新赋值了。

所以结果就明了了,够绕的。

以后你看到实际工作中有人这么些代码,就直接大耳刮子抽丫的。

使用道具 举报

回复
tengo84 该用户已被删除
18#
发表于 2009-1-14 09:58 | 只看该作者
说得好详细啊,

使用道具 举报

回复
论坛徽章:
0
19#
 楼主| 发表于 2009-1-14 23:29 | 只看该作者
不错,很详细,不过我现在工作转pl/sql了,就是写数据存储,哎,不知道有前途没

使用道具 举报

回复
论坛徽章:
2
开发板块每日发贴之星
日期:2009-01-20 01:01:03紫蛋头
日期:2012-03-14 11:15:43
20#
发表于 2009-1-19 18:25 | 只看该作者
原帖由 asdxxxyah 于 2009-1-8 20:16 发表
public class Signal {
        public static void main(String []args){
                Sig sig=Sig.getSig();
                System.out.println("count1="+sig.count1);
                System.out.println("count2="+sig.count2);
        }

}
class Sig {
        private static Sig sig=new Sig();
        public static int count1;
        public static int count2=0;
        private Sig(){
                count1++;
                count2++;
        }
        public static Sig getSig(){
                return sig;
        }
}

答案:count1=1
       count2=0
谁能告诉我其中的原因?为什么一个+1,另个却不加呢??这题目没理解


这道题不过是考,静态域初始化的过程,静态域初始化是按照从上至下的书写顺序进行的。
1.Sig sig=Sig.getSig();
首先调用Sig静态方法,这时候会触发class loader加载Sig类,实际上java中类加载有三个步骤,Loading--Linking--Initialization
Loading是,由类加载器执行,查找字节码,由那些字节码创造一个Class对象
Linking是,验证字节码,分配静态域的存储空间,如果需要的话,解决所有的引用,这里就解决了sig的引用对象new Sig()
Initialization是,如果有一个超类,初始化它。执行静态初始化器,和静态初始化块。

引起类初始化的条件是,第一次引用静态方法(构造器是暗示静态的),或者引用非常量静态域。

new Sig()方法后,count1=1,count2=1

2.public static int count1;
这里没有对count1进行赋值操作,所以仍然为1

3.public static int count2=0;
这里对count2进行了赋值为0的操作,所以count2为0

最后,这道题使用了单例模式,确保某一个类只有一个实例

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表