此文适合java入门者阅读,希望高手指点迷津,偶才学几天,可能写的错误百出,好多概念的理解也不是很准确.不要bs偶啊,有错误希望指出,谢谢.
<<java编程思想>>里有这样一个程序(稍微做了些修改)
public class EqualsMethod { //A程序
int i;
public static void main(String[] args) {
EqualsMethod v1=new EqualsMethod();
EqualsMethod v2=new EqualsMethod();
v1.i=v2.i=100;
System.out.println(v1.equals(v2));
}
}
第一次看到这里的时候,我第一眼觉得结果为true,运行的结果其实是false,书上说equals默认行为是比较reference,所以除非在新类里overide equals(),否则得不到想要的结果.当时没有弄多大明白,就跳过去了.想想,有空再思考它.后来,在baidu知道里,碰到有人问这个问题,想 给别人回答,却发觉自己原来也不是理解的很透彻.所以就狠下心来,好好研究下,查了不少资料,终于有些头绪.
首先说说关于equals()的一些理解,,equals是面向对象的操作符,是任何类的一个方法,都可以调用它,;语法格式为 Reference1.equals(Reference2 ) , 如果要比较两个对象是否一致,就可以使用equals.
运行上面的程序,结果为false,equals比较了v1,v2这两个reference,如果是新手,譬如我自己吧,会纳闷,程序中对v1,v2进行了赋了相等的值,,那就应该是相等的,结果应该是true才对.事实却不是这样的.那我们改动下程序,看下另外的运行结果:
public class EqualsMethod1 { //B程序
/**
* @param args
*/
public static void main(String[] args) {
EqualsMethod1 v1=new EqualsMethod1();
EqualsMethod1 v2=new EqualsMethod1();
System.out.println(v1.equals(v2));
}
}
结果还是false,这样可以说明定义"i"和赋值,对于比较结果没有什么影响的.对上面的程序再稍做修改:
public class EqualsMethod { //C程序
public static void main(String[] args) {
EqualsMethod v1=new EqualsMethod();
EqualsMethod v2=new EqualsMethod();
v1=v2;
System.out.println(v1.equals(v2));
}
}
输出结果为true.v1=v2?该怎样理解呢?赋值?还是其他???先放到一边....查了一些资料,得出了equals做比较时,是调用的句柄做比较.(其实我也不知道句柄是个什么概念,)" 在windows中,句柄是和对象一一对应的32位无符号整数值。对象可以映射到唯一的句柄,句柄也可以映射到唯一的对象。""这个是在windwos中的定义,不知道拿到这里来是否适用.暂且认为一样吧.所以在程序b里,两个对象,v1,v2在new的时候,都各自被分配了句柄,,句柄是唯一的,.所以程序b的执行结果为false.
在程序c,出现了v1=v2;结果就true了,又是为什么呢?原来v1=v2,不是把v2的值赋给v1,而是把v2句柄copy给v1,所以v1,v2指向的就是同一个对象.结果自然就true了.
还想写,不过觉得好多都理解错了,可能上面写的都是错的,思绪清楚了,再写吧!哎!失败!