一.
现在要谈论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这个声明。