介绍
Object是所有类的始祖类,没有被明确的指出超类默认就是继承该类
方法
equals方法
该方法默认检测两个对象是否具有相同的引用,返回true或false
但很多时候这种比较方式显得不那么合理,所以很多时候就需要我们来重写equals方法
- Java语言规范要求equals方法具有下面的特性
- 1.自反性:对于任何非空引用x,x.equals(x)必须返回true
- 2.对称性:x.equals(y)时y.equals(x)
- 3.传递性:x.equals(y)、y.equals(z)返回true---->x.equals(z)
- 4.一致性:如果没有其他变化,反复调用应该返回同样的结果
- 5.对于任意非空引用x,x.equals(null)返回false
- 编写一个完美的equals方法的建议
- 1.显式参数命名为otherObject,稍后需要转换为一个叫做other的变量
- 2.检测this与otherObject是否引用同一个对象:
if(this == otherObject) return true;
(一句优化,如果为相同引用则直接返回true,这比全部都一个一个比较域代价要小得多) - 3.检测otherObject是否为null,如果为null返回false(检测是否为空)
if(otherObject == null) return false;
- 4.比较this与otherObject是否属于同一个类
- 如果equals语义在每个子类中有所改变就用getClass
if(getClass() != otherObject.getClass()) return false;
- 语义在每个子类中都统一则用instanceof:
if(!(otherObject instanceof ClassName)) return false;
- 如果equals语义在每个子类中有所改变就用getClass
- 5.将otherObject转换为对应类类型的变量
(ClassName)otherObject
- 6.开始对所有需要比较的域进行比较(用==比较基本类型域、用equals比较对象域)return field1 == other.field…
- ps:如果在子类中重新定义equals,就要在其中包含调用super.equals(other)
对于数组类型的域,可以使用静态的Arrays.equals方法检测相应的数组元素是否相等
hashCode方法(散列码)
toString方法
用于返回表示对象值的字符串
- 绝大多数的toString方法遵循的格式:类的名字+方括号括起来的域值
- 写一个toString方法:
public String toString(){
return getClass().getName()
+"[name=" + name
+",salary=" + salary
+ "]";
}
- ps:子类的toString方法只要调用super.toString()然后再加上方括号部分.
- 注意:对象与一个字符串操作符“+”连接起来就会自动的调用tostring方法(所以x.toString()和
""+x
效果一样) - toString方法是一种非常有用的调试工具,建议每一个自定义类都加入一个toString方法