Object类是所有类的超类。即便你不写extends Object 也是默认继承的。
Java中只有基本类型不是对象,其他全部是对象。
1 equals()方法
所有的类都有equals()方法,因为它是Object里面的方法。
public boolean equals(Object obj) {
return (this == obj);
}
覆盖equals()方法
public class Employee
{
...
public boolean equals(Object otherObject)
{
// 是否相同引用
if (this == otherObject) return true;
// 是否没有引用
if (otherObject == null) return false;
// 类型是否相同
if (getClass() != otherObject.getClass())
return false;
// 现在知道otherObject是一个非null的Employee类型了
Employee other = (Employee) otherObject;
// 具体比较每一个值
return name.equals(other.name)
&& salary == other.salary
&& hireDay.equals(other.hireDay);
}
}
class Manager extends Employee
{
...
public boolean equals(Object otherObject)
{
if (!super.equals(otherObject)) return false;
// super.equals已经检查了是不是相同的类
Manager other = (Manager) otherObject;
return bonus == other.bonus;
}
}
2 相等测试与继承
采用instanceof关键字来替代getClass()会产生一些不符合相等测试的原则。
- 自反性,自身比较返回true
- 对称性,互相对称调用应该返回相同的值
- 传递性,x等于y,y等于z,则x等于z
- 一致性,反复调用应得到相同的值,如果指向没有变的话
- 对null的测试应该返回false
现在感觉第二条应该有问题啊,为什么一定要对称性呢?多态就不是对称的嘛。其实关键地方还是在于,你想比较的相等到底是想比较什么??确定这个才好进行比较啊。
java.util.Arrays类的方法
- static boolean equals(type[] a, type[] b)
比较两个数组是否相等
java.util.Objects类的方法
- static boolean equals(Object a, Object b)
如果a和b都是null,返回true,一个是null,返回false,然后返回a.equals(b)
3 hashCode()方法
String类的hashCode()方法
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
String类的hashCode()方法是不安全的,因为会产生重复的int值啊,不好用。
自己定义hashCode()方法
public class Employee
{
public int hashCode()
{
return 7 * name.hashCode()
+ 11 * new Double(salary).hashCode()
+ 13 * hireDay.hashCode();
}
...
}
优化后
public int hashCode()
{
return 7 * Objects.hashCode(name)
+ 11 * Double.hashCode(salary)
+ 13 * Objects.hashCode(hireDay);
}
这样也可以
public int hashCode()
{
return Objects.hash(name, salary, hireDay);
}
注意:如果x.equals(y)返回true,那么x和y应该具有相同的hashCode()值。
java.lang.Object类的方法
- int hashCode()
返回内存地址。
java.util.Objects类的方法
- static int **hash(Object… objects)
返回多个对象的hashCode值的组合 - static int hashCode(Object a)
返回hashCode值,加了null检查
java.util.Arrays
- static int hashCode(type[] a)
计算数组的hashCode值
4 toString()方法
变成文本显示出来而已。
这是Object类的toString()方法。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
注意:System.out.println()内的参数,就是执行toString()方法的。
注意:数组直接用+和字符串相连,也是调用其默认的toString()方法的。如果真想输出数组内容,应该使用Arrays.toString方法,前面说过的。
java.lang.Object
- Class getClass()
获得包含对象信息的类对象。 - boolean equals(Object otherObject)
比较内存指向是否相等。 - String toString()
返回对象值的字符串。
java.lang.Class
- String getName()
获得类名
- Class getSuperclass()
获得父类Class对象信息