Object类的简介
java.lang.Object
- java.lang包在使用的时候无需显示导入,编译的时候由编译器自动导入
- Object类是所有类的超类,是java中唯一没有父类的类,如果没有明确地指出超类,Object就被认为是这个类的超类
- 在Java中,只有基本类型不是对象
Object类的方法
equals方法()
- Object类中的equals方法用于监测一个对象是否等于另外一个对象。但是,如果单单是在Object类当中,这个方法仅仅只判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的
- 为什么每个类要重写equals的原因:然而,对于多数类来说,这种判断没有太大的意义。例如两个Employee对象,需要判断的是两个对象的name、time和salary是否相等,而不仅仅只是判断两个对象是否具有相同的引用
- 在类中equals的重写:
class Employee
{
String name;
double salary;
Date hireDay;
...
//此处用Object类接收所有的类型
public boolean equals(Object otherObject){
//1.判断是否是相同的引用
if(this == otherObject) return true;
//2.判断对象是否为空
if(otherObject == null) return false;
//3.判断是否是同一个类
if(getClass() != otherObject.getClass()) return false;
//4.做类型转换
Employee other = (Employee) otherObject;
//5.检测各个域是否相等
return name.equals(other.name)
&& salary == other.salary
&& hireDay.equals(other.hireDay);
}
...
}
- 为什么要用getClass()而不用instanceof
- 例如有一个引用对象Employee e,和一个对象Manager m,并且两个对象具有相同的姓名、薪水和雇佣日期。现在判断 e.equals(m),当代码执行到 m instanceof Employee 的时候,返回的是true。但是如果判断m.equals(e),e instanceof Manager的时候,返回了false。这违背了Java语言对equals方法的特性要求,自反性:a == b , b == a 。
hashCode()
- 每个对象都拥有自己的一个散列码,是一个整形值,如果重写了equals方法,就必须重写hashCode方法
- hashCode的返回值必须是int,举例说明:
class Employee
{
public int hashCode()
{
return 7*name.hashCode()+11*new Double(salary).hashCode
+13*hireDay.hashCode();
}
}
- 为什么重写了equals就必须重写hashCode:感觉不错的解答,总结的就是,如果重写了equals而不重写hashCode可能导致两个对象通过equals方法判断为相等,但是却具有不同的散列值
toString()
- toString()方法,它用于返回表示对象值的字符串。例如,Point类的toString方法将返回下面这样的字符串:
java.awt.Point[x=10,y=20]
- 随处可见toString方法的主要原因是:只要对象与一个字符串通过操作符“+”连接起来,Java编译器就会自动地调用toString方法,以便获得这个对象的字符串描述
- 强烈建议为自定义的每一个类增加toString方法。这样做不仅自己受益,而且所有使用这个类的程序员也会从这个日志记录支持中受益匪浅