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这个声明。

     

  • 相关阅读:
    Windows Store App 主题动画
    Windows Store App 过渡动画
    Windows Store App 控件动画
    Windows Store App 近期访问列表
    Windows Store App 文件选取器
    Windows Store App 访问应用内部文件
    Windows Store App 用户库文件分组
    Windows Store App 获取文件及文件夹列表
    Windows Store App 用户库文件夹操作
    Windows Store App 用户库文件操作
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/7854343.html
Copyright © 2011-2022 走看看