一起Talk Android吧(第八十回:Java中的超级类-Object之equals)

各位看官们,大家好,上一回中咱们说的是Java中的超级类-Object的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧!

看官们,我们在上一回中提到了超级类提供的三大方法,这一回中我们详细介绍第一大方法:equals

看官们,equals()方法用来比较两个对象是否相同,

例如:obj1.equals(obj2)

表示判断对象obj1与obj2是否相同,如果它们相同返回true,否则返回false

该方法默认的实现为判断两个变量是否引用了相同的对象。这是最简单的判断,显然不符合我们的需求。通常来讲,如果两个对象相同,那么这两个对象的内容应该相同。鉴于这个原则,我们需要重写该方法。如何重写呢?我们提供了以下原则供大家参考:

  • 1.检查对象是否为空;
  • 2.检查是否引用同一个对象;
  • 3.检查两个对象是否属于同一个类;
  • 4.检查两个对象中每个成员变量的值是否相同;

    下面是示例代码,请参考:

@Override
        public boolean equals(Object obj) {
            // TODO Auto-generated method stub
            //该条件包含了原则1和3
            if(obj != null && obj.getClass() == this.getClass()) {
                //该条件包含了原则2
                if(obj == this)
                    return true;

                CustomClass cusObj = (CustomClass)obj;
                //判断类中每个成员变量的值是否相同
                if(cusObj.mIntValue == this.mIntValue && 
                cusObj.mStrValue.equals(this.mStrValue))
                    return true;
            }

            return false;

上面的代码包含了我们刚才提到的所有原则,大家可以结合注释来理解。另外在实现是否为相同类的条件时,使用了getClass()方法,该方法可以返回对象的类。这是以前没有介绍过的知识。上面代码中使用的CustomClass是一个自定义的类,它包含两个成员变量,一个为int类型,另外一个为String类型,所以才有代码中的第二个条件。

看官们,我们建议大家在自定义的类中重写该类,不然会它就会使用Object类默认的实现来比较对象,这样的结果不是我们想要的。最常见的就是数组类。

//定义两个数组变量
        int [] array1 = new int [] {1,2,3}; 
        int [] array2 = new int [] {1,2,3};

        //使用Object类默认的方法来比较两个数组是否相同
        if(array1.equals(array2)) 
            System.out.println("array1 == array2");
        else
            System.out.println("array1 != array2");

        //使用Arrays类中重写的方法来比较两个数组是否相同
        if(Arrays.equals(array1, array2))
            System.out.println("array1 == array2");
        else
            System.out.println("array1 != array2");

下面是程序的运行结果,请参考:

array1 != array2
array1 == array2

大家从该结果中可以看到,同样的比较,但是有不同的结果。我们在第一次比较时没有重写equals方法,因此使用了Object类默认的equals方法进行比较,第二个比较时使用了Arrays类的equals方法进行比较。从结果中可以看出来,第二次比较的结果正确的。有看官说,我们没有重写Arrays类中的equals方法呀,我们确实没有,不过Java提供的类库中重写了该方法。还有一个常用的类也重写了该方法,那就是String类,因此我们在比较两个String对象时经常使用该方法。大家想想,Java类库中提供的类都重写了该方法,我们还有什么理由不去重写自定义类中的该方法呢。因此再次建议大家自定义类的时候重写该方法

各位看官,关于Java中的超级类-Object之equals的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

相关文章
相关标签/搜索