日期:2014-05-20  浏览次数:20710 次

我对基本类型和引用类型,还有==和equals方法的理解。
以下是我的理解,如果有理解不正确的地方,还请前辈们指出来,感谢所有热心帮助渴望进步的晚辈们的前辈!

基本类型是java里最基础的类型,所有的引用类型都基于基本类型。不说String类吧,我感觉它比较特殊,它是由基本类型构成的引用类型(字符数组)和其它基本类型构成的。随便写一个简单的类:

class   A{
        private   int   i;
        pvivate   boolean   b;
}

这个类就是由int和boolean这两种基本类型构成的,当然,它可以有自己的其它方法。不,在java里,随便一个类肯定有自己的方法,因为它们都继承自Object。所谓类,就是基本类型和方法的组合。

而==是用于比较基本类型的值,或者用于比较引用类型的地址(我在想也许内存地址也是一种基本类型)。而equals是基于==,通过==比较封装在引用类型里的基本类型的值来比较引用类型是否相等的。

所有类型的基类Object类,它的equals方法源代码只有一句:
public   boolean   equals(Object   obj)   {
return   (this   ==   obj);
        }

再看看特殊的String类的equals方法:

public   boolean   equals(Object   anObject)   {
if   (this   ==   anObject)   {
        return   true;
}
if   (anObject   instanceof   String)   {
        String   anotherString   =   (String)anObject;
        int   n   =   count;
        if   (n   ==   anotherString.count)   {
char   v1[]   =   value;
char   v2[]   =   anotherString.value;
int   i   =   offset;
int   j   =   anotherString.offset;
while   (n--   !=   0)   {
        if   (v1[i++]   !=   v2[j++])
return   false;
}
return   true;
        }
}

仔细看,都是通过比较基本类型!=或者==来返回equals的值的。

我上面的那个类的equals方法可以写成
public   boolean   equals(Object   obj)   {
if   (this   ==   obj)   {
        return   true;
}
if   (obj   instanceof   A)   {
                          if(this.i==obj.i   &&   this.b==obj.b)
                                  return   true;
}
                  return   false;

        }


我觉得“类”、“封装”这些概念现在已经挺清晰的了。

另外,我一直在想,数组应该是一个引用类型,是一种特殊的引用类型,这种引用类型的成员都是同一种类型。我觉得数组是一种比其它引用类型更底层的引用类型。

以上如果有理解不正确的地方,还请前辈们一定指出来,再次感谢!

------解决方案--------------------
基本正确

关于equals的方法不是很完整,其实equals首先比较是否是当前对象,也就是自身和自身比较,如果是则返回true,否则比较对象是否是当前类类型的,是的话才比较内部的数据