楼主: MrZhang

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

[复制链接]
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
11#
发表于 2005-3-10 13:15 | 只看该作者
静态变量的初始化在构造函数之后


最初由 MrZhang 发布
[B]变量的初始化在方法之前啊 [/B]

使用道具 举报

回复
论坛徽章:
0
12#
发表于 2005-3-11 09:35 | 只看该作者

修改

class Singleton{
        static{
                System.out.println("载入类";
        }
        private static Singleton obj = new Singleton();
        static{
                System.out.println("obj初始化完毕";
        }
        public static int counter1;
        static{
                System.out.println("counter1初始化完毕";
                System.out.println("counter1="+counter1);
        }
        public static int counter2 = 0;
        static{
                System.out.println("counter2初始化完毕";
                System.out.println("counter2="+counter2);
        }  
        private Singleton(){
                System.out.println("进入构造函数";
                counter1++;
                System.out.println("counter1++:"+counter1);
                counter2++;
                System.out.println("counter2++:"+counter2);
                System.out.println("退入构造函数";
        }
        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);
        }
}

使用道具 举报

回复
论坛徽章:
13
ITPUB元老
日期:2005-06-28 13:48:45蛋疼蛋
日期:2011-08-07 22:06:092010广州亚运会纪念徽章:武术
日期:2010-10-02 13:25:112010年世界杯参赛球队:加纳
日期:2010-03-03 22:00:34生肖徽章2007版:鸡
日期:2009-12-05 13:55:07生肖徽章2007版:狗
日期:2009-03-21 05:52:34生肖徽章2007版:猴
日期:2008-12-05 05:17:06奥运会纪念徽章:击剑
日期:2008-08-28 19:03:31奥运会纪念徽章:举重
日期:2008-08-28 12:53:00ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
13#
发表于 2005-3-11 11:53 | 只看该作者
good~ for basic knowledge

使用道具 举报

回复
论坛徽章:
0
14#
 楼主| 发表于 2005-3-11 11:56 | 只看该作者
上面的高手牛啊,写的明明白白
再请教:Singleton obj = Singleton.getInstance();
与Singleton obj =new Singleton();的区别在哪些?

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
15#
发表于 2005-3-11 13:02 | 只看该作者
what can I say?

使用道具 举报

回复
论坛徽章:
0
16#
发表于 2005-3-14 16:43 | 只看该作者
什么大公司啊?有东软大么?东软今年的笔试题都没有这么难啊!!

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
17#
发表于 2005-3-15 10:51 | 只看该作者
理论上单例模式为了保持仅有一个实例所以让构造函数私有,不允许显示的创建新类,而只允许用getInstance()获得他的唯一实例,所以就上面的例子来讲Singleton obj =new Singleton();是错误的
不过好象在什么书上看到过可以定义public构造函数,记不得了

说的不好,见笑了

使用道具 举报

回复
论坛徽章:
0
18#
发表于 2005-3-16 10:35 | 只看该作者

Re: Re: 非常简单,高手再看这个。

最初由 pillow 发布
[B]lbdl是高手,讲的非常清晰

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

[/B]

下面是Think in java 中关于成员初始化的例子:

class Tag {
  Tag(int marker) {
    System.out.println("Tag(" + marker + "";
  }
}

class Card {
  static Tag t1 = new Tag(1);
  Card() {
     System.out.println("Card()";
    t3 = new Tag(33);
  }
  static Tag t2 = new Tag(2);
  void f() {
    System.out.println("f()";
  }
  static Tag t3 = new Tag(3);
}

public class OrderOfInitialization {
  public static void main(String[] args) {
    Card t = new Card();
    t.f();
  }
}

执行结果为:
Tag(1)

Tag(2)

Tag(3)

Card()

Tag(33)

f()
并非按照大侠所说的,先进入构造函数。请高手分析这两个例子。

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
19#
发表于 2005-3-16 13:35 | 只看该作者
两个例子都没有错,一般情况下应该是先走静态变量初始化再走构造函数,但是第一个例子中private static Singleton obj = new Singleton();在初始化obj的时候已经去调用私有的构造函数private Singleton(){..}并获得了一个实例,,然后再初始化其他的静态变量。这是单例模式的特点。而第二个例子中每调用一次new都会重新创建一个新的实例

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2005-3-16 19:45 | 只看该作者

纠正!

最初由 long_biti 发布
[B]两个例子都没有错,一般情况下应该是先走静态变量初始化再走构造函数,但是第一个例子中private static Singleton obj = new Singleton();在初始化obj的时候已经去调用私有的构造函数private Singleton(){..}并获得了一个实例,,然后再初始化其他的静态变量。这是单例模式的特点。而第二个例子中每调用一次new都会重新创建一个新的实例 [/B]


综述上面两个例子:

JAVA class中的初始化次序取决于变量在class中的定义次序,变量的定义可能散落各处,但变量一定会在任何一个函数(包括构造函数)被调用之前完成初始化。〕
  大家再有什么疑问可以参考Think in java中关于类成员初始化顺序的描述。

使用道具 举报

回复

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

本版积分规则 发表回复

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