【java】学习路径16-重写Object方法(equals()等)

Posted on 2022-03-12 16:18  罗芭Remoo  阅读(104)  评论(0编辑  收藏  举报

在平时开发中,想要比较自定义类对象中的特定成员时,我们需要逐一手动比较,非常不方便。

举个栗子,我们有两个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键,鼠标点击想要查看的方法,跳转的位置即为调用的位置。