Equals方法的学习

2017-12-09 11:30:22

Equals方法
  • java听一般情况下,不可以再用 == 来比较旬否相等的情况,而是要用Equals方法来比较,Equals方法属于Object类并且不是final类型,所以任何类都可以继承并且覆盖该方法

看下面的这一个例子

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        B b1 = new B(20);
        B b2 = new B(20);
        System.out.println(b1 == b2);

    }
}

class B
{
    private int i;

    B(int i)
    {
        this.i = i;
    }
}

程序运行结果为false,如图

因为对象之间不可以使用"=="来比较,因为这样比较的是对象的内存地址,而不是对象中的具体属性
但是如果我们把代码稍微的更改一下,更改代码如下

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        B b1 = new B(20);
        B b2 = new B(20);
        System.out.println(b1.equals(b2));

    }
}

class B
{
    private int i;

    B(int i)
    {
        this.i = i;
    }
}

运行结果如下

运行结果依然是false,这是因为equals和"=="是一样的,比较的同样是内存中的地址,如果我们重写equals方法,代码如下

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        B b1 = new B(20);
        B b2 = new B(20);
        System.out.println(b1.equals(b2));

    }
}

class B
{
    private int i;

    B(int i)
    {
        this.i = i;
    }

    public boolean equals(B b2)
    {
        if(this.i == b2.i)
        {
            return true;
        }else{
            return false;
        }
    }
}

运行结果如下

覆盖后的equals方法比较的不再是两个对象的内存地址,而是根据自己的需求来决定.本例中比较的是变量i的值,当两个对象的i都等于20,此时两个对象比较结果返回了true.

  • Equals方法在一般情况下都需要覆盖成自己想要的方法.而且配合多态可以实现强大的"比较"功能.可以比较类中的任何数据,可以根据自己的需求来定义两个对象是否相等的条件.
    下面增加一个类C,代码如下
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        B b1 = new B(20);
        B b2 = new B(20);
        System.out.println(b1.equals(b2));

        C c1 = new C(10);
        C c2 = new C(10);
        System.out.println(c2.equals(c1));

    }
}

class B
{
    private int i;

    B(int i)
    {
        this.i = i;
    }

    public boolean equals(B b2)
    {
        if(this.i == b2.i)
        {
            return true;
        }else{
            return false;
        }
    }
}

class C extends B {
    private int j;
    C(int j) {
        super(j);
        this.j = j;
    }

}

执行结果如下

说明我们从C类继承 B类,B类所定义的方法是可以使用的.但是我们B类的equals方法,接收的形参是B b2这样的形式,也就是B类的对象,但是我们传过来的是C类的对象,这就是多态.我们在C类中使用的,只可以是从B类中继承过来的方法和变量.我们比较的仍旧是i,我们可以通过调用 B类的构造方法为其赋值.