查看: 41038|回复: 56

[精华] 一个大公司JAVA考题的问题

[复制链接]
论坛徽章:
0
发表于 2005-3-8 16:03 | 显示全部楼层 |阅读模式
class Singleton
{
1)  private static Singleton obj = new Singleton();
2)  public static int counter1;                    
3)  public static int counter2 = 0;               
4)  private Singleton()                             
    {
      counter1++;
      counter2++;
    }
5)  public static Singleton getInstance()                     
    {
      return obj;
    }
}
public class MyMain {
  public static void main(String[] args) {
    Singleton obj = Singleton.getInstance();
    System.out.println("obj.counter1=="+obj.counter1);
    System.out.println("obj.counter2=="+obj.counter2);
  }
}
谁能告诉我这个答案为啥是
obj.counter1==1  
obj.counter2==0
吗?
1,2,3,4,5的执行顺序如何
论坛徽章:
0
发表于 2005-3-8 23:04 | 显示全部楼层

结果!应为1,6

顺序为:
1,4,2,3,5

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2005-3-8 23:17 | 显示全部楼层

Re: 结果!应为1,6

最初由 Grant Fei 发布
[B]顺序为:
1,4,2,3,5 [/B]


----我开始那里有笔误,正确为:public static int counter2=0;
再想请教下为啥是14235的执行顺序呢?根据什么依据?

使用道具 举报

回复
论坛徽章:
0
发表于 2005-3-9 09:12 | 显示全部楼层

非常简单

这是一道考java基本功的很好的题目。

下面我们分析以下它的执行过程:
运行MyMain之后,
首先执行Singleton.getInstance();
它的执行过程是这样:
首先是Singleton类的装载,然后JVM会初始化Singleton类,初始化的过程中,需要初始化静态变量。就是按顺序依次初始化:
1、初始化private static Singleton obj = new Singleton();new会调用构造函数,因为构造函数使用了counter1和counter2,所以先让counter1后变成1,然后让counter2变为1。
2、继续初始化public static int counter1; 因为没有赋值,所以couter1仍然是1
3、继续初始化public static int counter2 = 0,这时候有赋值运算,所以counter2变成了0

非常简单吧?请程序员们注意打好基础。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2005-3-9 10:54 | 显示全部楼层
上面的兄弟,再问下,第5步在什么时候执行呢
这里的执行顺序是否是:5,1,2,3,4,2,3,其中2,3是否执行了两次呢

使用道具 举报

回复
论坛徽章:
0
发表于 2005-3-9 18:37 | 显示全部楼层
当然是最后运行了!

使用道具 举报

回复
论坛徽章:
0
发表于 2005-3-9 19:52 | 显示全部楼层
其实不是执行2次,第一次是初始化,分配内存而已。

顺序是:1-4-3-5(静态存储区初始化)

2不执行。因为第二步没有进行变量初始化。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2005-3-9 22:47 | 显示全部楼层
private static Singleton obj = new Singleton();
这个是声明一个obj的类,它直接就会调用那个构造函数吗?

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
发表于 2005-3-10 11:29 | 显示全部楼层

Re: 非常简单

lbdl是高手,讲的非常清晰

由于在java中int值没有做初始化时,系统为其默认置0,同时jvm在做完构造函数的初始化之后才会初始化静态变量,因此会出现以上结果。
如果把变量的static修饰去掉,结果就不同了

最初由 lbdl 发布
[B]这是一道考java基本功的很好的题目。

下面我们分析以下它的执行过程:
运行MyMain之后,
首先执行Singleton.getInstance();
它的执行过程是这样:
首先是Singleton类的装载,然后JVM会初始化Singleton类,初始化的过程中,需要初始化静态变量。就是按顺序依次初始化:
1、初始化private static Singleton obj = new Singleton();new会调用构造函数,因为构造函数使用了counter1和counter2,所以先让counter1后变成1,然后让counter2变为1。
2、继续初始化public static int counter1; 因为没有赋值,所以couter1仍然是1
3、继续初始化public static int counter2 = 0,这时候有赋值运算,所以counter2变成了0

非常简单吧?请程序员们注意打好基础。 [/B]

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2005-3-10 11:41 | 显示全部楼层
变量的初始化在方法之前啊

使用道具 举报

回复

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

本版积分规则 发表回复

PostgreSQL中国大会,参会票抢购!

由 PostgreSQL中文社区与ITPUB联合主办的第九届《PostgreSQL 中国技术大会》将在北京隆重召开。PostgreSQL 作为功能最强的的开源关系型数据库之一,得到了越来越多企业的推广和运用,也越来越受到广大技术爱好者的欢迎和重视。这将是 PostgreSQL 的又一次交流盛会。
----------------------------------------
时间:2019年11月29~11月30日

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