zoukankan      html  css  js  c++  java
  • JAVA-初步认识-第十一章-object类-equals方法覆盖

    一.

    现在要谈论equals方法另一个方面。如果不写equals方法,直接用==来比较也是可以的,貌似equals方法有点多余。

    现在不比较对象是否相等,而是比较对象中的特定内容,比如说对象的年龄,之前的写法如下

    其实这个方法写完后,本类中还是具备equals方法,因为它继承了object类,所有类都是继承根类的。(无论写还是不写extends object)

    compare和equals都是比较对象,只不过侧重点不一样,两者有些重复。既然对象自身具备着是否相同的功能,我们就没有必要再重新定义了。借用比较的功能,但是对其内容进行复写。

    有人写成下面的情况,这就不是复写,这是你自己定义的一个功能。这是重载,而不是复写。

    我们不想比较地址值,想要比较年龄,默认比较的是return this==obj;我们改成下面这样的。

     

    现在来检验一下

    为什么会出错呢?传递进来的类中没有age成员变量,为什么呢?就在于equals方法中的形参是equals类型,原先p2是person类型,这样自动提升了类型称为了equals类型,就失去了特有数据,限制了功能。

    你想要进行扩展性的应用,你就需要运用多态的形式,而多态一用,就会隐藏子类型。因为,它们都会向上转型。猫一旦变成动物,你想调用它抓老鼠就很难了。但是还想用,就要想到怎么向下转型。

    编译运行的结果也是真的。

    我们知道,如果我们不覆盖这个方法的话,它就是假,因为地址值不一样。我们一旦覆盖了的话,建立的是年龄比较。

    接下来,我们放入的是Demo类,如下所示,(但是其中Demo类中,没有任何东西,没有age,那么貌似无法比较)

    编译结果如上,Demo不能被转成person,向上提升类型可以,但是向下强转是不行的,因为从Demo类到person类是行不通的。它接收的范围很广,但是用的时候只有一个。这时候需要做健壮性判断。

    写成上面这样有些不太合适,不同类型也是可以输入,不行的话,给个false结果。意味着猪也可以和人进行比较,即使种类差别很大。所以,我们说只有同类型才可以进行比较,不同类型咱就别比了。非同类型,就让你挂掉,不仅仅是给个false,而是抛出一个异常的回复。retunrn false只用来表示同类型,成员变量不相等。那么抛出异常时,是抛出编译异常,还是运行时异常。(我觉着编译还是可以,而且程序无法识别输入的到底是什么,只有在运行输入数据时,才能判别出有错误)

    视频中讲解到,抛出编译异常是抛不出去的,要抛出去的话,需要object obj=p2这个声明。

     

  • 相关阅读:
    iOS 将对象的属性和属性值拆分成key、value,通过字符串key来获取该属性的值
    [IOI2005] Riv 河流
    [洛谷P4549] [模板] 裴蜀定理
    [NOIp2013] 货车运输
    [NOIp2015] 运输计划
    18.10.01模拟赛总结
    [洛谷P3369] 普通平衡树 Treap & Splay
    [NOIp2016] 组合数问题
    [洛谷P4777] [模板] 扩展中国剩余定理
    [洛谷P3384] [模板] 树链剖分
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/7854343.html
Copyright © 2011-2022 走看看