你的Value类应该这么写: class Value { private int i; public Value(int i) { this.i=i; } public int intValue() { return i; } public boolean equals(Object obj) { if (obj instanceof Value) { return i == ((Value)obj).intValue(); } return false; } }Interger 就是这么干的.你直接写成: System.out.println(v1.equals(v2)); 而不override equals() 是不选择,因为那样直接比较的是两个引用,v1和v2的地址. 你可以通过用: System.out.println(v1); System.out.println(v2); 看也它们的差异.那个System.out.println(v1.i.equals(v2.i)); 显然也是不行的,因为这就相当于: int i= 100; int j= 100; i.equals(j)一样. 但 int 是基本类型,它不可以这样做.
应该写得很清楚吧,
关于·自定义的类·需要重写equals方的事,
还有toString方法,
搂住再好好度一下。除了这个,自定义的类和java内置的类在使用上还有什么不同呢?
没有。
都是类怎么会有不同呢。
之所以觉得不同是还没有了解根超类Object的概念而已。
嗯,如果硬要说有的话,
也是有的。
自己写的可以改,
觉得那里不合时,
想怎么改就怎么改,
·java内置的类·没有特殊必要是不应该更改的。呵呵,
胡说了。
我试了试,不能通过编译,提示
C:\j2sdk1.4.2\execise>javac Equalsmethod3.java
Equalsmethod3.java:12: int cannot be dereferenced
System.out.println(v1.i.equals(v2.i));而且如果说v1.equals(v2)比较的是类的引用(两个引用之间肯定是不等的)
那么,难道Integer重写过的equals方法就不是了么,如果不是的话,那是什么呢?
继续请教!
很显然,v1和v2指向了两个不同的对象(只是这两个对象的一个数据域相等了而已).因此,equals返回了false.对于提及的Integer类,它是覆写了Object.equals方法的,那么比较的时候会按照它自己施加的逻辑进行比较,而不会使用 Object.equals方法. 如果你要想你的类有一个正确的(符合期望的)比较结果,那么你得覆写equals方法(推荐一并覆写hashCode方法),像这样:class Value
{
int i;
public boolean equals(Object obj){
if(!(obj instanceof Value))//如果不是Value类型的
return false;
Value v = (Value)obj; //是Value类型的,Cast不会出错
return (v.i == i); //这可能是你期望的方式
}
}
同意,但是,System.out.println(v1.i.equals(v2.i));
会出错
System.out.println((v1.i) == (v2.i)); //应该可行,但不推荐如此进行对象的比较
而Integer类已经重写了equals()方法,比较的就是那个int值的大小
很简单的啊
== 就是关于对象的比较了,看看下面就知道了public class Difference{
String a1 = "difference";
String a2 = new String(a1);
String a3 = "diff"+"erence"; public static void main(String[] args){
Difference diff = new Difference();
System.out.println("a1==a2 "+(diff.a1==diff.a2));
System.out.println("a1==a3 "+(diff.a1==diff.a3));
System.out.println("a2==a3 "+(diff.a2==diff.a3));
System.out.println("diff.a1.equals(diff.a2) "+(diff.a1.equals(diff.a2)));
System.out.println("diff.a1.equals(diff.a3) "+(diff.a1.equals(diff.a3)));
System.out.println("diff.a2.equals(diff.a3) "+(diff.a2.equals(diff.a3)));
}
} 输出结果是:
a1==a2 false
a1==a3 true
a2==a3 false
diff.a1.equals(diff.a2) true
diff.a1.equals(diff.a3) true
diff.a2.equals(diff.a3) true
Press any key to continue...
前者是比较(对象)变量值是否相等
后者是指是否指向内存单元中的同一对象
class Value
{
private int i;
public Value(int i)
{
this.i=i;
}
public int intValue() {
return i;
}
public boolean equals(Object obj) {
if (obj instanceof Value) {
return i == ((Value)obj).intValue();
}
return false;
}
}Interger 就是这么干的.你直接写成: System.out.println(v1.equals(v2));
而不override equals() 是不选择,因为那样直接比较的是两个引用,v1和v2的地址.
你可以通过用:
System.out.println(v1);
System.out.println(v2);
看也它们的差异.那个System.out.println(v1.i.equals(v2.i));
显然也是不行的,因为这就相当于:
int i= 100;
int j= 100;
i.equals(j)一样.
但 int 是基本类型,它不可以这样做.
会出错的原因是v1.i是int,是基本类型,不是对象,所以不可以调用方法
equals方法在wraper类中是重写object类的equals,object类中的equals就是“==”
而wraper类中的equals只是比较了内容,不用内存地址
而程序库中的类大多都覆写了equals(),比较的是对象的内容
就是 treeroot(根根)说的
Interger i;
System.out.println(i);
看到的不再是 i 所指向的地址,而是i所代表的值. 因为toString()是这样重写的:
public String toString() {
return String.valueOf(i);
}
而 System.out.println(i)就相当于System.out.println(i.toString());
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}