《Java解惑PPT5》深入探讨了Java编程中的一些常见困惑和陷阱,特别是关于类、构造器重载以及静态域的使用。以下是对其中两个关键Puzzle的详细解析: **Puzzle 46:令人混淆的构造器** 在这个谜题中,作者展示了如何Java的重载解析机制可能导致意外的结果。`Confusing`类有两个私有构造器,一个接受`Object`参数,另一个接受`double`数组。在`main`方法中尝试用`null`调用构造器。按照Java的重载规则,编译器首先找到所有可用的构造器,然后在这些构造器中选择最精确的一个。由于`null`可以被赋值给任何对象类型的引用,因此在第一阶段,两个构造器都被认为是可行的。然而,在第二阶段,编译器会选择接受`double`数组的那个构造器,因为它更具体。 要强制使用`Confusing(Object)`构造器,需要明确地将参数转换为`Object`类型。这表明在编写代码时,应避免过于模糊的重载,以减少潜在的混淆。最佳实践是为每个方法或构造器赋予独特的参数列表,或者考虑使用不同的方法名来表示不同的行为。 **Puzzle 47:猫?狗?** 这个谜题涉及到了类的继承和静态域的使用。`Counter`类包含一个静态整型变量`count`,以及两个同步的静态方法用于增加计数和获取当前计数。`Dog`和`Cat`类都继承自`Counter`,并在各自的构造器中调用了`increment()`方法。在`Ruckus`类的`main`方法中,创建了`Dog`和`Cat`的对象数组,并通过它们的方法调用`increment()`。然而,预期的计数结果并没有正确地反映出每种动物的叫声数量,因为所有这些类共享同一个`count`静态变量。 问题的关键在于静态域是类级别的,而非实例级别的。这意味着所有`Dog`和`Cat`的实例都在同一个`count`上进行操作。为了修复这个问题,可以采用组合而非继承,即在`Dog`和`Cat`类中包含一个`Counter`实例,而不是继承它。这样每个实例都会有自己独立的计数器,从而得到正确的计数结果。 总结这两个Puzzle,我们可以得出以下几点重要的Java编程指导原则: 1. 在设计类时,明智地选择继承或组合。继承适用于“is-a”关系,而组合适用于“has-a”关系。 2. 明确理解Java的重载解析机制,避免创建可能导致混淆的重载方法或构造器。 3. 谨慎使用静态域,因为它们是类级别的,所有实例共享。若需每个实例拥有独立的数据,应使用实例域。 4. 当涉及到共享状态(如计数)时,优先考虑使用非静态成员或对象组合,以保持数据隔离。 通过深入理解这些概念,开发者可以编写出更清晰、更健壮的Java代码,避免潜在的陷阱和错误。
剩余37页未读,继续阅读
- 粉丝: 1
- 资源: 51
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0