Java基础——Object类的三个常用方法

内容整理自《Java 核心技术 卷一》

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方法。这样做不仅自己受益,而且所有使用这个类的程序员也会从这个日志记录支持中受益匪浅

转载出处 https://blog.csdn.net/HughGilbert/article/details/71213682

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页