`
song020cn
  • 浏览: 63206 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于《Java解惑》“谜题52:合计数的玩笑”的引申讨论

    博客分类:
  • Java
阅读更多
	static final class StaticCheck {
		static {
			getValue();
		}
		
		private static int value;

		public StaticCheck() {
			super();
			System.out.println("check value:" + getValue());
		}
		
		private static boolean isInit = false;
		
		private static int getValue() {
			if (isInit) {
				return value;
			}
			for (int i = 0; i < 100; i++) {
				value += i;
			}
			return value;
		}
	}

main方法:

	public static void main(String...args) {
		new StaticCheck();
	}

  

这是跟书中原意相同的代码。结果呢,不用说,大家也就猜到了。

就是getValue方法执行了两遍。

 

但是,我做了一点小小的改动,结果好像又对了。

	static final class StaticCheck {
		static {
			getValue();
		}
		
		private static int value = 0;

		public StaticCheck() {
			super();
			System.out.println("check value:" + getValue());
		}
		
		private static boolean isInit = false;
		
		private static int getValue() {
			if (isInit) {
				return value;
			}
			for (int i = 0; i < 100; i++) {
				value += i;
			}
			return value;
		}
	}

 差异在这里:

private static int value = 0;

 

我又重新给value赋值了。

所以,虽然getValue执行了两遍,但是由于value、isInit这两个变量,在第二次执行之前,都重新初始化了。所以,结果又对了。

 

如果,要说问题的隐蔽性的话,个人认为后一种更难发现,因为它的执行结果是符合预期的。但是,如果哪天有人对代码进行了小小的修改。

例如:

		private static int value = 0;
		
		static {
			getValue();
		}

 那可就惨了!!!

 

0
2
分享到:
评论

相关推荐

    Java解惑(谜题)CHM中英文双版本

    谜题52:合计数的玩笑 谜题53:按你的意愿行事 谜题54:Null与Void 谜题55:特创论 Java谜题6——库谜题 谜题56:大问题 谜题57:名字里有什么? 谜题58:产生它的散列码 谜题59:什么是差? 谜题60:一行...

    java解惑 java 表达式谜题 java 字符谜题 java 循环谜题 java 异常谜题

    本文将深入探讨Java中的表达式谜题、字符谜题、循环谜题以及异常谜题,帮助你解开这些编程难题,进一步提升你的Java技能。 ### Java表达式谜题 Java表达式是程序中进行计算的部分,它们可以是简单的变量引用,也...

    java 解惑.pdf

    ### Java解惑知识点详解 #### 一、表达式谜题 **谜题1:奇数性** - **描述**:程序看似应该返回一个布尔值,表明一个数字是否为奇数,但结果却出乎意料。 - **解惑**:在进行模运算时,需要注意负数的情况。当输入...

    Java解惑/Java谜题(CHM)

    我整理出来的Java解惑/谜题的CHM版本,包括目录、全文搜索和收藏夹。比目前Word/PDF版本的多个目录,比TXT版本的多一些格式。-- 如果不能打开CHM,请按下面方法解决:-- 右键点击chm文档,查看属性,可以看到...

    JAVA解惑(JAVA谜题) 中文版(PDF)

    ### JAVA解惑中的关键知识点解析 #### 谜题1:奇数性的判断 在《JAVA解惑》一书中,作者通过一系列实例介绍了Java编程语言中的一些不易掌握的知识点。其中一个例子是关于如何正确判断一个整数是否为奇数。 **原始...

    java解惑(java谜题)中文版的

    4. **多线程**:Java提供了强大的多线程支持,但并发编程中的同步、锁和线程安全问题常常是谜题的来源。 5. **字符串操作**:String在Java中是不可变的,对字符串的频繁操作可能导致不必要的内存消耗。 6. **数组...

    Java解惑(中文版)_java_java解惑_solve65p_

    《Java解惑(中文版)》是一本专为Java初学者设计的学习资料,旨在帮助读者解答在学习Java过程中遇到的各种困惑。"solve65p"可能代表这本书包含65个问题或主题,每个都深入浅出地进行了讲解,旨在解决初学者在编程...

    java 解惑 java 解惑 java 解惑

    java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑

    java解惑 书籍类 谜题

    ### Java解惑 书籍类 谜题 #### Java谜题1——表达式谜题 **谜题1:奇数性** 本节讨论了一个看似简单的Java方法,旨在判断一个整数是否为奇数: ```java public static boolean isOdd(int i) { return i % 2 ==...

    java解惑 PDF版

    文档《java解惑 PDF版》中列举了95个这样的谜题,每个谜题都旨在帮助开发者理解并纠正一些常见的错误理解。以下是根据提供的部分内容解析的几个相关知识点。 ### 表达式谜题与取余操作符(%)的行为 在Java中,...

    Java解惑 中文版

    1. **内存管理**:Java的垃圾回收机制是其一大特色,但也常常引发疑问。书中详细解释了如何理解和控制对象生命周期,避免内存泄漏和性能问题。 2. **异常处理**:异常处理是Java程序的重要组成部分。书中会讲解如何...

    iava解惑,深入剖析java

    《深入剖析Java》一书旨在帮助Java开发者解决在编程过程中遇到的困惑,通过一系列精心设计的谜题,深入探讨Java语言的核心概念、语法特性和易错点。以下是对部分谜题的详细解析,以加深对Java的理解。 谜题1:奇数...

    JAVA 解惑 java经典

    6. **多线程**:Java提供了丰富的API支持多线程编程,如Thread类、Runnable接口,以及synchronized关键字、volatile关键字等,理解并发编程的概念和实践方法对于开发高效程序至关重要。 7. **IO流**:Java的IO流...

    Java解惑.pdf

    1. **基础语法**:Java的基础语法包括变量、数据类型、运算符、流程控制(如if-else,switch,for,while等)、方法定义与调用等。理解这些基础知识是编写任何Java程序的前提。 2. **类与对象**:面向对象编程是...

    java谜题解惑 中文chm

    在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上迥异的程序行为的简单解释的同时,更向读者展示了如何一劳永逸地避免底层的陷阱与缺陷。 本书以轻松诙谐的语言,寓教于乐的方式,由浅入深、...

    Java Puzzlers 中文版(Java解惑)

    Java Puzzlers 中文版(Java解惑) Java 谜题 1——表达式谜题 谜题 1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转 吗? public static boolean isOdd(int i){ return i % 2 == 1...

    JAVA面试谜题解惑.pdf

    ### JAVA面试谜题解惑知识点解析 #### 表达式谜题:奇数性检查方法的缺陷 **题目背景:** 题目中提到的谜题旨在检验面试者对Java中的基本数学运算符及其行为的理解程度。具体来说,是针对取余运算符`%`在处理整数...

    Java PUZZLE Java 解惑

    Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑

Global site tag (gtag.js) - Google Analytics