我对基本类型和引用类型,还有==和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,否则比较对象是否是当前类类型的,是的话才比较内部的数据