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

xiaoxiao2021-02-28  84

内容整理自《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://www.6miu.com/read-29220.html

最新回复(0)