java的Object类是所有类的父类,JDK中的类和用户自定义的类都默认继承于Object类。因为所有的类都继承于Object类,各个类定义时省略了extends Object这一声明。Object中包含若干个方法如clone、equals、hashCode、getClass、finalize、toString、wait、notify、notifyAll()。接下来对这些方法进行介绍。

一、clone方法

该方法是实现对象的拷贝,只有实现了Cloneable接口的类才可以调用该方法,否则抛出CloneNotSupportedException异常。拷贝有浅拷贝和深拷贝,浅拷贝和深拷贝的概念是针对引用数据类型而言。

  1.浅拷贝

下面举例说明如下,声明一个Person类,该类有两个属性,一个是基本数据类型int,另一个是引用数据类型Date,如下图所示:

java 类copy包 java object copy_深拷贝

图1定义Person类

浅拷贝的例子:首先声明了一个Person对象p1,通过赋值操作将p1赋值给p2,此时p1和p2的birthday属性指向同一块内存空间,在程序的上下文中,将p1或p2的birthday修改将反映在另一个对象上,如下图2和3所示。

java 类copy包 java object copy_深拷贝_02

图2 浅拷贝示例

java 类copy包 java object copy_浅拷贝_03

图3浅拷贝示例运行结果

  2.深拷贝

深拷贝的例子:首先声明了一个Person对象p1,通过赋值操作将p1的克隆对象赋值给p2,此时p1和p2的birthday属性指向不同的内存空间,在程序的上下文中,p1和p2的birthday对象是相互独立的,p1或p2中修改birthday属性将互不影响,如下图4和5、6所示。

java 类copy包 java object copy_浅拷贝_04

java 类copy包 java object copy_深拷贝_05

图4实现Cloneable接口的对象

java 类copy包 java object copy_java 类copy包_06

图5深拷贝示例

java 类copy包 java object copy_内存空间_07

图6深拷贝示例运行结果

二、equals方法

查看该方法的源码可知,equals用来判断当前对象是否和另一个对象指向同一块内存空间。如果是指向同一块内存空间,则返回true,否则返回false。在实际的编码中通常需要根据实际的业务规则来重写该方法。equals源码如下图所示:

java 类copy包 java object copy_浅拷贝_08

图7 equals方法源码

三、hashCode方法

该方法用于哈希查找,在集合类中确定对象的存放位置,可以减少查找中使用equals的次数。一般要满足obj1.equals(obj2)==true则obj1.hashCode()一定等于obj2.hashCode()。如果两个对象的hashCode一样,则不一定满足两个对象做equals运算时返回true。

四、getClass方法

该方法返回该对象的运行时类类型,它常和getName方法一起使用。如下图所示:

java 类copy包 java object copy_java_09

图8获得运行时对象的类型和名称

五、finalize方法

该方法用于释放对象所占资源,但不是立即释放对象所占资源,而是等待jvm下一次的垃圾回收动作发生时才会回收相应的资源。

java 类copy包 java object copy_java_10

图9 finalize方法使用示例