- _nosay
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类的构造方法为其赋值.