在平时开发中,想要比较自定义类对象中的特定成员时,我们需要逐一手动比较,非常不方便。
举个栗子,我们有两个cafe对象,我们想比较两杯咖啡的价格是否一样,一般来说我们使用getter()来比较,但是这样写非常麻烦,
于是我们重写equals()方法。
现在我们有两个类:User()主类 、 Cafe()类。
Cafe()类:
public class Cafe {
private String name;//咖啡的名字
private int price;//咖啡的价格
public Cafe(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {return name;}
public void setName(String name)
{this.name = name;}
public int getPrice() {return price;}
public void setPrice(int price)
{this.price = price;}
}
倘若我们不重写equals()方法,Cafe类:
public class User{
public static void main(String[] aa) {
Cafe c1 = new Cafe("西达摩",33);
Cafe c2 = new Cafe("云南冰滴",33);
System.out.println(c1==c2);//输出false
System.out.println(c1.equals(c2));
//false 每一个类都继承自object类,所以有equals方法
Cafe c3 = c1;
System.out.println(c3.equals(c1));
//因为c3和c1指向同一块内存区域,所以输出true
}
}
输出 false false true
第五行中直接用==直接比较的时c1 c2的内存引用地址,我写的基础篇1中有说到,new出来在栈中的对象都是独一无二的,输出false
第六行的默认equals方法比较的是对象的内存地址,当然不同,输出false
第八行的c3被赋值了c1的内存地址,再用equals方法比较,显然内存地址相同,输出false
那么我们如何比较不同cafe咖啡对象的价格呢?
一个方法是使用c1.getPrice()函数。
另一个方法就是重写equals()函数。
步骤:
1、我们在Cafe类中重写equals()方法。
需要特别注意的是:虽然我们没有在Cafe类中定义equals()方法,但是Java规定所有的类都继承自Object类,equals()方法在Object类中。
重写后的Cafe类:
1 public class Cafe {
2 private String name;//咖啡的名字
3 private int price;//咖啡的价格
4
5 public boolean equals(Cafe caf) {
6 return caf.getPrice() == this.getPrice();
7 }
8
9 public Cafe(String name, int price) {
10 this.name = name;
11 this.price = price;
12 }
13
14 public String getName() {return name;}
15 public void setName(String name) {this.name = name;}
16 public int getPrice() {return price;}
17 public void setPrice(int price) {this.price = price;}
18 }
5-7行即为重写equals方法。我们再运行起来,结果是false true true。
System.out.println(c1.equals(c2));
上面这一条语句中,equals方法被重写了
2、如何查看方法是否被重写
在IDE中按住CTRL键,鼠标点击想要查看的方法,跳转的位置即为调用的位置。