课时80:对象比较
摘要:本内容为 Object 类之中对象比较的介绍。
1.对象比较:( Equals )定义
2.对象比较:( Equals )实例
01:对象比较:( Equals )定义
Object 类之中另外一个比较重要的方法就是在于对象比较的处理上,所谓的对象比较主要的功能是比较两个对象的内容是否完全相同。
假如有两个 Person 对象,要想确认这两个对象是否一致(例如正在公布彩票的中奖号码,公布林强 20 号中奖,林强 20 号就是一个信息,另一个人也应该具备这个信息,于是林强从 80 公里外跑过来领奖,但是中途彩票丢失),但是两个对象本身会有不同的内存地址数值,所以此时的比较应该通过内容的比较完成。
02:对象比较:( Equals )实例
范例:对象比较的基础实现
用 Person 来举例,对内容比较:
Public String getName () { Return this.name ; } Public int getAge () { Return this.age ; } If (perA.getName().equals(perB.getName()) && perA.getAge() == perB.getAge()) { System.out.println(“是同一个对象。“) ; } else { System.out.println(“不是同一个对象。”) ; }
每一个属性都要拿来比较,这是对象比较之中最基础的实现,编译代码,执行程序,得出结论是同一个对象,这是一个比较基础的对象比较。
此时的确实现了对象比较的功能,但是这个功能比较麻烦:
(1)由于需要进行对象比较的时候要将每一个属性都进行相等判断,所以在外部要调用大量的 Getter ()方法;
(2)对象比较应该是一个类内部所具备的功能,而不应该在外部定义;例如林强在上课的时候睡觉,老师告诉他“他叫林强”和“刚才低头快睡着了”这两个信息,他会自己比对。
If (perA.getName().equals(perB.getName()) && perA.getAge() == perB.getAge()) { System.out.println(“是同一个对象。“) ; } else { System.out.println(“不是同一个对象。”) ; }
类似于上面这种在外部实现的对象比较并不标准,此时应考虑在内部实现。
·Obeject 类作为所有类的父类提供了对象比较操作的支持,对于对象比较的操作实现可以使用 Equals()
的方法完成。
·对象比较: Public boolean equals(Object obj) ,
可以接收所有类型;(进行类设计时不应该考虑子类,因此 Object 是合理的,因为只要是比较对象即可。 Object 类是系统提供的类,其对应的 Equals应该有具体的实现)看源代码,默认情况下该方法只是进行了两个对象的地址判断,并没有进行内容判断。
Public boolean equals(Object obj){ Return(this == obj); }
对于实际的使用者而言,如果想要正确实现判断处理,必须在子类中覆写此方法,并且进行属性判断。
范例:观察 Object 类中的 Equals() 方法覆写。
Public boolean equals(Object obj) {
首先 Object 类是 Person 覆类,要想进行属性判断,没有需要的属性,要向下强制性转型中找该属性,代码中应该先执行一个(Person)obj
,其目的是为了获取类中的属性。
Person per = (Person) obj ; // 目的是为了获取类中的属性
//Equals()
方法这个时候会有两个对象:当前对象this、传入的Object。
Private 的特点是只能在类内部访问,Per 算类内部,如果内部有个需要打破常识的情况,我们可以进行如下判断:
If(this.name.equals(per.name))
, 因为 Per 是类内部,可以通过对象直接访问属性。
并且要求 This.age == per.age) {}
该代码有以下两种写法:后一种写法更为简洁
Return false ; Return this.name.equals(per.name) && this.age == per.age
将代码编译一下执行之后,结果仍正确。
System.out.println(perA.equals(perB)) ;
有一天林强很无聊的说:我转世 30 代之后是否像当前这么帅,可他并没有去世,不能知道转世 30 代之后的模样,就可以假设没有这个人,就出现了空指向(人不在不可以调用属性),应该再加一个判断:if(obj == null) { // 不关心 null 的比较
可以保证代码不出错:
林强有一天自己跟自己比较是否是同一个人,按照自己的实现,应该是“我的鼻子是我的鼻子,我的嘴是我的嘴,我的舌头是我的舌头”,已经确定两个人是同一个对象,再进行比较浪费时间,就可以直接 Reture true
If (this == obj) { // 同一个地址 Return ture ;
林强有一天说我自己跟一只狗比较是否相同,狗此时是 String 类,可以用 Object 接收,此时 String 类中有这个属性吗, String 是 Person 的对象吗,此时将代码编译执行,结果表明比较必须同类完成,即人不能跟狗比较。
同类完成:
If (obj instanceof Person)) { Return false ; }
结果表明人不能和狗进行比较。此时实现了对象比较的处理操作。
String 类作为 Object 的子类,这个类里面实际上已经覆写了Equals() 方法。
String 类中的 Equals() 方法定义:接收的 Object 型,此时 String类也是覆写的 Object 中的 Equals() 方法,这就是对象比较。
许多概念都需要对象比较支持, Object 可以接收所有对象,也就是所有引用实例,并且提供有 Perstring() 和Equals() 两个重要方法。