您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> JAVA >> 辅导 >> 正文    
  JAVA更多的类谜题74:同一性的危机 【注册男护士专用博客】          

JAVA更多的类谜题74:同一性的危机

www.nanhushi.com     佚名   不详 

下面的程序是不完整的,它缺乏对Enigma的声明,这个类扩展自java.lang.Object。请为Enigma提供一个声明,它可以使该程序打印false: 
public class Conundrum {
    public static void main(String[] args) {
        Enigma e = new Enigma();
        System.out.println(e.equals(e));
    }
}

噢,还有一件事:你不能覆写equals方法。 
乍一看,这似乎不可能实现。因为Object.equals方法将测试对象的同一性,通过Enigma传递给equals方法的对象肯定是与其自身相同的。如果你不能覆写Object.equals方法,那么main方法必然打印true,对吗? 
别那么快下结论,伙计。尽管本谜题禁止你覆写(override)Object.equals方法,但是你是可以重载(overload)它的,这也就引出了下面的解谜方案: 
final class Enigma {
    // Don’t do this!
    public Boolean equals(Enigma other){
         return false;
    }
}

尽管这个声明能够解决本谜题,但是它的做法确实非常不好的。它违反了谜题58的建议:如果同一个方法的两个重载版本都可以应用于某些参数,那么它们应该具有相同的行为。在本例中,e.equals(e)和e.equals((Object)e)将返回不同的结果,其潜在的混乱是显而易见的。 
然而,有一种解谜方案是不会违反这项建议的: 
final class Enigma {
     public Enigma() {
          System.out.println(false);
          System.exit(0);
     }
}

可能会有些争论,这个解谜方案似乎违背了本谜题的精神:能够产生我们想要的输出的println调用出现在了构造器中,而不是在main方法中。然而,它确实解决了这个谜题,你不得不承认它很伶俐。 
这里的教训,可以参阅前面的8个谜题和谜题58。如果你重载了一个方法,那么一定要确保所有的重载版本行为一致。

 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    专 题 栏 目

      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)                            【进男护士社区逛逛】
    姓 名:
    * 游客填写  ·注册用户 ·忘记密码
    主 页:

    评 分:
    1分 2分 3分 4分 5分
    评论内容:
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。