`
aaron_ch
  • 浏览: 178127 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Java tips

    博客分类:
  • Java
阅读更多
// 程序1
class Singleton {
  private static Singleton obj = new Singleton();
  public static int counter1;
  public static int counter2 = 0;
  private Singleton() {
    counter1++;
    counter2++;
  }
  public static Singleton getInstance() {
    return obj;
  }
}

// 程序2
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

你有没有被此结果吓一跳?乍看程序代码,你很可能会认为counter1和counter2的值一定会相等,但执行结果显然不是如此。其实,程序1被编译后的程序应该等同于下面的程序3:

// 程序3
class Singleton {
  private static Singleton obj;
  public static int counter1;
  public static int counter2;
  static { // 这就是class constructor
    // 在进入此class constructor之前,class已经被JVM
    // 配置好内存,所有的static field都会被先设定为0,
    // 所以此时counter1和counter2都已经是0,且singleton为null
    obj = new Singleton(); // 问题皆由此行程序产生
    // counter1不会在此被设定为0
    counter2 = 0; // counter2再被设定一次0(其实是多此一举)
  }
  private Singleton() { // 这是instance constructor
    counter1++;
    counter2++;
  }
  public static Singleton getInstance() {
    return obj;
  }
}

这是因为:当class具有static field,且直接在宣告处透过「=...」的方式设定其值时,编译器会自动将这些叙述依序搬到class constructor内。同样地,当class具有instance field,且直接在宣告处透过「=...」的方式设定其值时,编译器会自动将这些叙述依序搬到instance constructor内。

此程序在class constructor内,还未将static field初始化时(这时候,counter1和counter2都是0),就呼叫instance constructor,而instance constructor竟然还会去更动static field的值,使得counter1和counter2都变成1。然后instance constructor执行完,回到class constructor,再把counter2的值设为0(但是
counter1维持不变)。最后的结果:counter1等于1,counter2等于0。

欲改正程序1,方法有三:

-方法一:将singleton field的宣告调到counter1与counter2 field之后。
                  这是最好的作法。
-方法二:将counter2=0的宣告中,「=0」的部分删除。这种作法只有在希望
-方法三:将初始化的动作搬到class constructors内,自行撰写,而不依赖
                  编译器产生。这是最保险的作法。
分享到:
评论

相关推荐

    1000 Java Tips

    《1000 Java Tips》是一本专门为Java程序员和开发者准备的实用指南,它集结了1000个关于Java编程的技巧、建议和最佳实践。这本书覆盖了Java语言的各个方面,从基础语法到高级特性,旨在提升读者的编程效率和代码质量...

    330 Java Tips(330 JAVA 小技巧)

    根据提供的文件信息,我们可以推断出这是一本包含330个Java小技巧的书籍或文档,旨在帮助读者提升Java编程技能。虽然具体内容没有详细列出,但从描述中我们可以大致了解到这本书涉及了Java的多个方面,并且鼓励用户...

    Java Tips

    【Java Tips】这篇博客主要探讨了Java编程中的实用技巧和最佳实践,旨在帮助开发者提高代码质量和效率。在Java开发过程中,理解和掌握这些技巧是至关重要的,因为它们可以帮助我们避免常见错误,优化性能,并且使...

    330 个 有用的Java Tips

    这里我们将探讨"330个有用的Java Tips"这个主题,它涵盖了Java编程的各种技巧和最佳实践,旨在帮助开发者提高代码质量,提升开发效率。 1. **理解基础**:Java的基础包括类、对象、接口、继承、多态等核心概念。...

    500 Java Tips

    《500 Java Tips》是一份集合了大量Java编程实用技巧和最佳实践的资源,旨在帮助开发者提升在Java开发中的效率和代码质量。这个压缩包包含了一份名为"500 JAVA Tips.pdf"的PDF文件,这很可能是由一系列独立的Java...

    500 JAVA Tips

    根据给定文件的信息,我们可以总结出“500 JAVA Tips”这一资料中涵盖的主要知识点及其相关信息。 ### 一、概述 “500 JAVA Tips”是一份由作者收集整理的关于Java编程语言的知识资料,包含了从多个Java论坛及新闻...

    1000个Java技巧1000 Java Tips

    856页A4格式的Java技巧,实际日常Java经验提供的建议和解决方案。

    java tips everyday课程内容预览

    javaTipsEveryday来自http://javatipseveryday.com - The Brand New Java Training Course的课程内容一览,大体包括java SE,java开发框架等等 1.如何设计Java编程职业。 2.成功建立职业生涯的秘密策略。 3.像专业...

    330-Java-Tips.rar_LOT

    《330 Java Tips&Tricks》是一份包含大量Java编程技巧和问题解答的资源集合,对于想要深入理解和提升Java编程技能的开发者来说,是一份非常宝贵的资料。这份压缩包中的核心文件是“330 Java Tips.pdf”,它涵盖了...

    Java学习Tips330个

    作者表达了对读者的热情欢迎,并简要介绍了这份文档的内容来源:“330 Java Tips”是他从个人网站、多个Java论坛和新闻通讯中收集的好问题及答案的集合。 #### 1.2 网站推荐 文档推荐访问作者的网站 ...

    难得的英文java技巧汇总

    - 本书名为《1000 Java Tips》,是作者在过去四年里从新闻通讯中收集的棘手问题及答案的集合。 - 作者提出了几个问题: 1. 是否正在准备Java认证考试并希望一次性通过? 2. 是否正在寻找Java程序员的工作并想为...

    java-swing-tips, 包含 Java Swing的示例.zip

    java-swing-tips, 包含 Java Swing的示例 java-swing-tips英语: 使用小源代码示例介绍 Java Swing的GUI 程序。 许可证https://github.com/aterai/java-swing-tips/blob/master/L

    学java该看的一些书~

    - **《Java Tips and Tricks》**:该书通过一系列的小贴士和技术要点帮助读者解决常见问题,并掌握一些高效编程的方法。 - **O'Reilly 出版的《Java I/O》**:深入介绍了 Java 输入输出流的概念和使用方法,对于理解...

    ways-to-java-study.rar_site:www.pudn.com

    "ways-to-java-study.rar"这个压缩包文件显然包含了帮助学习Java的资源,特别是"1000 Java Tips翻译",这可能是一个包含了一千个Java编程技巧和解决常见问题的中文译文集。这些提示和解决方案对于初学者以及有经验的...

    1000_Java_Tips_low.pdf

    这本PDF文档,名为“1000_Java_Tips_low.pdf”,是由javafaq网站精心编撰的,旨在为Java开发者提供1000个实用的编程技巧和最佳实践。这份资料无疑是Java开发者提升技能、优化代码、解决问题的重要参考资料。 首先,...

Global site tag (gtag.js) - Google Analytics