对java里equals的一些理解!

时间:2021-07-29 18:51:39

    此文适合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了.
      还想写,不过觉得好多都理解错了,可能上面写的都是错的,思绪清楚了,再写吧!哎!失败!