java-Equals方法
1.1Equals方法1.2Equals方法2.注意事项
1.1Equals方法
Equals方法 java中一般情况下,不可以再用==来比较是否相等的情况,而是要用Equals方法来比较, Equals方法属于Object类并且不是final类型,所以任何类都可以继承并且覆盖该方法.
例子
package Epuals
;
public class MetHod {
private int rather
;
MetHod(int rather
){
this.rather
=rather
;
}
public static void main(String
[] args
) {
MetHod rather
=new MetHod(20);
MetHod rather1
=new MetHod(20);
System
.out
.println(rather
==rather1
);
}
}
这里我们先用等于来看看是什么就结果可以看到为false 因为在Java语言里双等于号是比较内存地址 而不是对象的任何一个值 无论如何 只要内存地址不一样就一直为false *注意! 对象之间不可以再用"=="来进行比较,因为这样比较的是对象的内存地址,而不是对象中的具体属性在用用Equals方法来比较
package Epuals
;
public class MetHod {
private int rather
;
MetHod(int rather
){
this.rather
=rather
;
}
public static void main(String
[] args
) {
MetHod rather
=new MetHod(20);
MetHod rather1
=new MetHod(20);
System
.out
.println(rather
.equals(rather1
));
}
}
运行结果还是false 为什么呢?因为Equals方法在默认Object类的默认的方法 和双等于一样的 都是比较内存地址 虽然语句不同了但实质上 和刚才的功能一样的那么怎么办呢?这时候我们要使用覆盖
package Epuals
;
public class MetHod {
private int rather
;
MetHod(int rather
){
this.rather
=rather
;
}
public boolean equals(MetHod rather1
){
if(this.rather
==rather1
.rather
){
return true;
}else{
return false;
}
}
public static void main(String
[] args
) {
MetHod rather
=new MetHod(20);
MetHod rather1
=new MetHod(20);
System
.out
.println(rather
.equals(rather1
));
}
}
运行结果这时候就为true了 为什么呢?因为覆盖后的equals方法比较的不再是二个对象的内存地址,而是根据自己的要求来决定.本例中比较的是变量rather的值,当二个对象的rather都等于20,此时二个对象的比较结果返回true
1.2Equals方法
Equals方法在一般情况下都需要覆盖成自己想要的方法.而且配合多态可以实现强大的"比较"功能,可以比较类中的任何数据,可以根据自己的需求来定义二个对象是否相等的条件代码如下
* package Epuals
;
public class MetHod {
private int rather
;
MetHod(int rather
) {
this.rather
= rather
;
}
static class MetHod2 extends MetHod {
private int fairly
;
MetHod2(int fairly
) {
super(fairly
);
this.fairly
= fairly
;
}
}
public boolean equals(MetHod rather1
) {
if (this.rather
== rather1
.rather
) {
return true;
} else {
return false;
}
}
public static void main(String
[] args
) {
MetHod rather
=new MetHod(20);
MetHod rather1
=new MetHod(20);
System
.out
.println(rather
.equals(rather1
));
MetHod2 fairly
=new MetHod2(100);
MetHod2 fairly1
=new MetHod2(20);
System
.out
.println(fairly
.equals(fairly1
));
}
}
这里我新建了一个类MetHod2并继承的MetHod的所有属性与方法然后在进行打印输出看看结果可以看到第一个打印为true20等于20对的 而100等于20为false也是对的了但是MetHod类中的方法是接收的形参是MetHod类的对象 而传进来的是MetHod2的对象 这说明这里使用了多态!想用MetHod2里面的fairly来进行比较呢?这样就不可以用继承过来的方法 因为继承过来的方法通过多态只可以访问从父类继承过来的变量 子类所特有的变量是不可以使用的 这样的话我们需要在子类自己写方法 覆盖代码如下
* package Epuals
;
public class MetHod {
private int rather
;
MetHod(int rather
) {
this.rather
= rather
;
}
static class MetHod2 extends MetHod {
private int fairly
;
MetHod2(int fairly
) {
super(fairly
);
this.fairly
= fairly
;
}
@Override
public boolean equals(MetHod rather1
) {
MetHod2 metHod2
= (MetHod2
) rather1
;
if (this.fairly
== metHod2
.fairly
) {
return true;
} else {
return false;
}
}
}
public boolean equals(MetHod rather1
) {
if (this.rather
== rather1
.rather
) {
return true;
} else {
return false;
}
}
public static void main(String
[] args
) {
MetHod rather
=new MetHod(20);
MetHod rather1
=new MetHod(20);
System
.out
.println(rather
.equals(rather1
));
MetHod2 fairly
=new MetHod2(100);
MetHod2 fairly1
=new MetHod2(20);
System
.out
.println(fairly
.equals(fairly1
));
}
}
运行结果
2.注意事项
1.Equals方法要把它改写如果不改写和双等于是一样的没有意义2.如果要访问子类所特有的就必须要在子类再次改写