随笔分类 - emanual_谜题_更多的类谜题(66-75)
摘要:这个程序的行为在 1.4 版和 5.0 版的 Java 平台上会有些变化。这个程序在这些版本上会分别做些什么呢?(如果你只能访问 5.0 版本的平台,那么你可以在编译的时候使用-source 1.4标记,以此来模拟 1.4 版的行为。) 该程序看起来根本没有使用 5.0 版的任何新特性,因此很难看出
阅读全文
摘要:下面的程序是不完整的,它缺乏对 Enigma 的声明,这个类扩展自 java.lang.Object。请为Enigma 提供一个声明,它可以使该程序打印 false: 噢,还有一件事:你不能覆写 equals 方法。乍一看,这似乎不可能实现。因为 Object.equals 方法将测试对象的同一性,
阅读全文
摘要:私有成员,即私有方法、域和类型这些概念的幕后思想是它们只是实现细节:一个类的实现者可以随意地添加一个新的私有成员,或者修改和移除一个旧的私有成员,而不需要担心对该类的客户造成任何损害。换句话说,私有成员被包含它们的类完全封装了。遗憾的是,在这种严密的盔甲保护中仍然存在细小的裂缝。例如,序列化就可以打
阅读全文
摘要:本谜题旨在检验当你试图隐藏一个 final 域时将要发生的事情。下面的程序将做些什么呢? 因为在 Jeopardy 中的 PRIZE 域被声明为是 public 和 final 的,你可能会认为Java 语言将阻止你在子类中重用该域名。毕竟,final 类型的方法不能被覆写或隐藏。如果你尝试着运行该
阅读全文
摘要:在 5.0 版中,Java 平台引入了大量的可以使操作数组变得更加容易的工具。下面这个谜题使 用了变量参数、自动包装、静态导入(请查看 http://java.sun.com/j2se/5.0/docs/guide/language[Java-5.0])以及便捷方法 Arrays.toString(
阅读全文
摘要:下面这个程序设计在不同的包中的两个类的交互,main 方法位于 hack.TypeIt 中。那么,这个程序会打印什么呢? 本谜题看起来很直观。Hack.TypeIt 的 main 方法对 TypeIt.ClickIt 类实例化,然后调用其 doIt 方法,该方法是从 CodeTalk 继承而来。接着
阅读全文
摘要:假设你不能修改前一个谜题(谜题 68)中的 X 和 C 这两个类。你能否编写一个类,其 main方法将读取 X.Y 类中的 Z 域的值,然后打印它。注意,不能使用反射。本谜题初看起来是不可能实现的。毕竟,X.Y 类被具有相同名字的一个域给遮掩了,因此对其命名的尝试将引用到该域上。事实上,我们是可以引
阅读全文
摘要:下面的程序在相同的范围内具有两个名字相同的声明,并且没有任何明显的方式可以在它们二者之间做选择。这个程序会打印 Black 吗?它会打印 White 吗?甚至,它是合法的吗? 没有任何显而易见的方法可以确定该程序应该打印 Black 还是 White。编译器通常会拒绝模棱两可的程序,而这个程序看起来
阅读全文
摘要:一个名字可以被用来引用位于不同包内的多个类。下面的程序就是在探究当你重用了一个平台类的名字时,会发生什么。你认为它会做些什么呢?尽管这个程序属于那种让你通常一看到就会感到尴尬的程序,但是你还是应该继续下去,把门锁上,把百叶窗拉上,然后试试看: 如果说这个程序有点让人讨厌的话,它看起来还是相当简单的。
阅读全文
摘要:在下面的程序中,子类的一个域具有与超类的一个域相同的名字。那么,这个程序会打印出什么呢? 对该程序的表面分析可能会认为它应该打印 Derived,因为这正是存储在每一个 Derived 实例的 className 域中的内容。 更深入一点的分析会认为 Derived 类不能编译,因为 Derived
阅读全文