Object类是java所有类的超类,如果一个类没有明确的指出超类,Object就被认为是这个类的超类。
Object类型的变量可以使用Object类型的变量引用任何类型的对象,但是具体使用时,还是要进行强制类型转换
在java中,只有基本类型不是对象
equals方法equals方法可以用于检测一个对象是否等于另外一个对象,Object类中的equals方法是确认两个对象的引用是否相同
具体使用时可以进行重写equals方法
public boolean equals (Object ob) {
// 查看引用是否相同
if (this == ob) {
rteurn true;
}
// 查看是否为null
if(ob == null) {
return false;
}
// 查看类是否相同
if (getClass() != ob.getClass()) {
return false;
}
// 现在知道了ob与当前对象是同一个类的,且不为null,假设为A类
A other = (A) ob;
// 对该对象中相应的变量进行比较,随便举几个例子
return name.equals(ob.name) && money == ob.money
}
在子类定义equals时,可以首先调用超类的equals方法
java语言规范要求equals方法具有以下特性
-
自反性:对于任何非空引用x x.equals(x)应返回true
-
对称性:对于任何引用x,y 当x.equals(y) 返回true时, y.equals(x)也应返回true
-
传递性:对于任何引用x,y,z 当x.equals(y) 返回true时, y.equals(z)返回true x.equals(z)也应返回true
-
一致性:如果x,y引用的对象没有发生变化,反复调用x.equals(y)应该返回相同的结果
-
对于任意非空引用x, x.equals(null) 应该返回false
编写一个完美的equals方法的建议
-
将传入的参数命名为otherObject,后面将其强转命名为other
-
先检测两个对象的引用是否相同
-
检测传入的otherObject是否为null,如果为null返回false
-
比较this和otherObject的类,如果equals的语义可以在子类改变,就用getClass,如果所有的子类都有相同的语义,可以用instanceof
-
将otherObject强转为相应类型
-
根据相等性要求来比较字段,== 比较基本数据类型,Object.equals比较对象字段(如果是子类重新定义equals,要调用父类的equals)(super.equals(other))
hashCode方法第四条可以理解为:
比如说有一个超类为person,两个子类,一个为teacher 另一个为student
person只定义 name id这两个变量
student也定义name 和 id
teacher相较于sutdent多salary这一个变量
如果两个teacher进行比较时,必须name id salary都必须相同,要用getClass
如果统一用id来进行比较,就能使用instanceof
每一个对象都有一个默认的散列码,由对象的存储地址得出,String是由内容得出的,内容一样,则hashCode相同
equals和hashCode方法必须相容,如果x.equals(y)返回true,那么x.hashCode()和y.hashCode()必须返回相同的值,所以如果重新定义了equals方法,必须重新定义hashCode方法
toString方法Object的toString方法会返回对象值的一个字符串
在设计子类的时候,可以重写自己的toString方法
当一个对象与一个字符串通过 + 连接起来,java编译器会自动调用toString方法
当一个对象x 调用System.out.println(x) 方法时,也会调用x.toStirng()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)