`

java解惑(谜题49。。)

阅读更多
谜题49:比生命更大
import java.util.Calendar;

public class Elvis {
	public static final Elvis INSTANCE = new Elvis();
	private final int beltSize;
	private static final int CURRENT_YEAR = Calendar.getInstance().get(
			Calendar.YEAR);

	public static void main(String[] args) {

		System.out.println("Elvis wears a size " + INSTANCE.beltSize()
				+ " belts.");

	}
	public int beltSize() {
		return beltSize;
	}

	private Elvis() {
		beltSize = CURRENT_YEAR - 1930;
	}
}

第一眼看去,这个程序是在计算当前的年份减去1930的值。但运行程序结果为:Elvis wears a size -1930 belts.
这个问题是由类初始化顺序中的循环而引起的。Elvis类的初始化是由虚拟机对其main方法的调用而触发的。首先,其静态域被设置为缺省值,INSTANCE为null,CURRENT_YEAR为0。接下来,静态域初始器按照其出现的次序执行。第一个静态域INSTANCE,它的值通过调用构造器而计算出的。这个构造器用一个涉及了静态域CURRENT_YEAR的表达式来计算的,而此时其值仍然是0。所以beltSize为-1930。
谜题50:不是你的类型
本谜题测试你对java的两个经典操作符:instanceof和转型的理解程度。
public class Type1 {
	public static void main(String[] args) {
		String s = null;
		System.out.println(s instanceof String); //false
	}
}

public class Type2 {
	public static void main(String[] args) {
		System.out.println(new Type2() instanceof String); 
	}
}

public class Type3 {
	public static void main(String[] args) {
		Type3 t = (Type3) new Object();
	}
}

第一个输出false,因为尽管null对于每一个引用类型来说都是其子类型,但是instanceof操作符被定义为在其做操作数为null时返回false
第二个程序编译失败,原因是:instanceof操作符有这样的要求,如果两个操作数的类型是类,其中一个必须是另外一个的子类型
第三个抛出 java.lang.ClassCastException异常
谜题54:null与void下面是经典hello world的变种,将打印什么呢?
public class Null {
	public static void greet(){
		System.out.println("hello world");
	}
	public static void main(String[] args) {
		((Null)null).greet();
	}
}

这个程序似乎应该抛出NullPointerException异常,但它打印出了“hello world”。
理解本谜题的关键是,Null.greet是一个静态方法。等价于greet()和Null.greet().
如果将方法的static去掉,就会出现异常。
谜题55:特创论
class Creature {
	private static long numCreated = 0;

	public Creature() {
		numCreated++;
	}
	public static long numCreated() {
		return numCreated;
	}
}
public class Creator {

	public static void main(String[] args) {

		for(int i = 0;i<100;i++)
			Creature creature = new Creature();
			System.out.println(Creature.numCreated());
	}
}

这是一个作弄人的问题,看似打印100,但是它根本不能编译。java语言规范不允许一个本地变了声明语句作为一条语句在for、while、do循环中重复执行。一个本地变量声明作为一条语句只能直接出现在一个语句块中
分享到:
评论

相关推荐

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

    java 表达式谜题 java 字符谜题 java 循环谜题 java 异常谜题 java 高级谜题 ......

    Java解惑/Java谜题(CHM)

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

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

    java解惑(java谜题)中文版的. 值得一看的JAVA资料. Java puzzlers

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

    Java解惑,是一本以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java...

    java解惑 书籍类 谜题

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

    java谜题解惑 中文chm

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

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

    谜题49:比生命更大 谜题50:不是你的类型 谜题51:那个点是什么? 谜题52:合计数的玩笑 谜题53:按你的意愿行事 谜题54:Null与Void 谜题55:特创论 Java谜题6——库谜题 谜题56:大问题 谜题57:名字里...

    《Java Pazzlers》Java解惑.pdf 书签齐全

    该书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...

    java解惑 PDF版

    95个谜题,即95个java开发者常见错误,经常混淆的地方,希望对大家有所帮助,这个pdf文档超清晰

    java解惑(+Java 解惑你知多少)

    本书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...

    java解惑95个谜题.doc

    Java谜题—对java的95个谜题进行讲解

    java解惑,解释java上百个谜题

    java解惑,揭示了上百个程序容易犯错且理解不清楚的问题

    java谜题解惑 中文版.rar

    java谜题解惑This Fifth Edition is completely revised and expanded to cover JavaScript as it is used in today's Web 2.0 applications. This book is both an example-driven programmer's guide and a keep-...

    Java Puzzlers 中文版(Java解惑)

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

    Java解惑.rar

    Java解惑,是一本以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java...

    Java谜题解惑 中文版CHM格式

    Java谜题1——表达式谜题 谜题1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转吗? public static boolean isOdd(int i){ return i % 2 == 1; } 奇数可以被定义为被2整除余数为...

    JAVA解惑_布洛赫.扫描版.(无保护,可修改)

    JAVA解惑_布洛赫.扫描版.(无保护,可修改) 《Java解惑》是由Joshua Bloch(美)、Neal Gafter(美)编著,陈昊鹏翻译的计算机语言类丛书,该书由人民邮电出版社2006年发行出版。该书特写了95个有关Java或其类库的陷阱和...

    JAVA解惑.pdf

    Java 谜题 谜题 20:我的类是什么? 下面的程序被设计用来打印它的类文件的名称。如果你不熟悉类字面常量,那么 我告诉你 Me.class.getName()将返回 Me 类完整的名称,即 “com.javapuzzlers.Me”。那么,这个程序...

    Java 谜题解惑

    Java 谜题解惑。如:奇数性、找零时刻、长整除、十六进制等相关疑惑。

    java谜题

    java谜题解惑 解决谜题最佳方案

Global site tag (gtag.js) - Google Analytics