
6.11 Object类
Object类是Java中最为常用的一个系统程序类,利用Object类可以实现参数的统一,本节将介绍Object类的特点以及基本使用。
6.11.1 基本作用
在Java中所有的类都有一个公共的父类就是Object类,一个类只要没有明显的继承一个类,则肯定是Object类的子类。如下两行代码表示的含义都是一样的:

那么既然继承了Object类,Object类有哪些用处呢?实际上在Object类中提供了很多的方法,这些方法经常被开发者所使用,Object类中的主要方法如表6-4所示。
表6-4 Object类中的主要方法

以上只是列出了Object类中比较常用的几个方法,其他的方法在本书的后续章节中会为读者介绍。那么以上的这些方法有哪些用处呢?实际上对于一个设计良好的类来说,最好覆写Object类中的equals()、hashCode()、toString()3个方法,考虑到学习知识的层次性,本章只对equals()和toString()方法的应用进行讲解,而hashCode()方法在Java类集应用中再为读者介绍。
6.11.2 主要方法
在讲解toString()之前,读者先来看以下的一段代码。
【例6.48】观察程序输出结果

程序执行结果:

上面的程序是随机输出了一些地址信息,从程序的运行结果可以清楚地发现,加与不加toString()最终的输出结果是一样的,也就是说对象输出的时候一定会调用Object类中的toString()方法打印内容。所以利用此特性就可以通过toString()取得一些对象的信息,如下面的代码。
【例6.49】应用toString()方法取得对象内容

程序执行结果:

程序的Person类中覆写了Object类中的toString()方法,这样直接输出对象的时候调用的是被子类覆写过的toString()方法。
equals()方法主要的功能就是用于对象的比较,实际上String也是Object类的子类,所以在String中已经实现好了此方法,如果现在一个类需要实现对象的比较操作,则直接在类中覆写此方法即可。
提示
Object类提供的equals()方法默认是比较地址。
在Object中的equals()方法实际上也是可以使用的,但是其默认使用的是按地址进行比较,并不能对内容进行比较。
【例6.50】对象的比较操作

程序执行结果:

在Person类中覆写了equals()方法,首先判断传递进来的对象与当前对象的地址是否相等,如果相等,则肯定是同一个对象,因为在equals()方法处传递的参数是Object类型,所以任何对象都可以接收,这样在对象进行向下转型之前就必须进行判断,判断传进来的对象是否是Person的实例,如果不是,则直接返回false;如果是,则将各个属性依次进行判断。
在编写测试方法的时候,为了测试程序的合理性,传入了一个字符串类型的对象,从结果中可以清楚地看见,因为字符串不是Person类型,所以直接返回了false。
6.11.3 接收任意引用类型的对象
既然Object类是所有对象的父类,则肯定所有的对象都可以向Object进行转换,在这其中也包含了数组和接口类型,即一切的引用数据类型都可以使用Object进行接收。
【例6.51】使用Object接收接口实例

程序执行结果:

通过上面的代码可以发现,虽然接口不能继承一个类,但是依然是Object类的子类,因为接口本身是引用数据类型,所以可以进行向上转型操作。
同理,也可以使用Object接口一个数组,因为数组本身也是引用数据类型。
【例6.52】使用Object接收数组

程序执行结果:

上面的程序使用Object接收一个整型数组,因为数组本身属于引用数据类型,所以可以使用Object接收数组内容,在使用Print()方法输出的时候通过instanceof判断类型是否是一个整型数组,然后进行输出操作。
提示
Object类在实际开发中的作用。
因为Object类可以接收任意的引用数据类型,所以在很多的类库设计上都采用了Object作为方法的参数,这样操作起来会比较方便。