【java】学习路径16-重写Object方法(equals()等)
在平时开发中,想要比较自定义类对象中的特定成员时,我们需要逐一手动比较,非常不方便。
举个栗子,我们有两个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类:
1 public class User{ 2 public static void main(String[] aa) { 3 Cafe c1 = new Cafe("西达摩",33); 4 Cafe c2 = new Cafe("云南冰滴",33); 5 System.out.println(c1==c2);//输出false 6 System.out.println(c1.equals(c2));
//false 每一个类都继承自object类,所以有equals方法 7 Cafe c3 = c1; 8 System.out.println(c3.equals(c1));
//因为c3和c1指向同一块内存区域,所以输出true 9 }
10 }
输出 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键,鼠标点击想要查看的方法,跳转的位置即为调用的位置。