java中Object类的方法

(一)、getClass();方法

这个方法是由final修饰的,子类无法对它进行重写,它的返回值类型是一个带泛型的Class类型。getClass();方法也是Java反射中常用的方法之一。

 

 

 (二)、hashCode();方法

该方法返回值类型是int类型的,hashCode方法是通过一系列的计算得到一个对象的hash值,hash值也是hash表存储的关键。

 

 

 (三)、equals();方法

equals方法作用的范围很广,它用于比较两个对象是否相等。在Object类中,equals方法是用==进行比较的,它比较的是这两个对象是否是同一个对象,即两个对象的引用是否指向同一处。

 

举个例子:

图1的两个对象的引用是指向不同区域的,所以是false。

图2相当于把对象1的引用赋给了对象2   两个对象指向的是同一块区域

 

 

 

 

 Object类中的equals方法就是这样比较的;但是大多数情况下,我们都会在类中根据需要重写equals方法。

(四)、clone();方法

首先说一下clone();方法的使用:

  直接使用对象的clone方法会报CloneNotSupportedException异常;要克隆的这个对象必须先实现Cloneable接口。

首先创建两个类,Person和Address;Person类是我们要克隆的类,Person类中含有Address这个引用类型的属性,Person类实现Cloneable接口。

 

 

 

 接下来判断克隆出来的对象和原对象是不是同一个对象

 

 输出结果如下:

 

 可以看到,克隆出来的对象和原来的不是同一个对象;但是两个对象里的属性是完全一样的,包括Address这个引用类型的属性也是一样的。

这里又牵扯到两个新的概念:深拷贝和浅拷贝

  对于浅拷贝-----------浅拷贝不是真正拷贝了另一个对象;对象虽然是两个不同的对象,但是对象的属性是完全一样的;对于引用类型的属性,复制的只是地址;是同一份。Object类中的clone就属于浅拷贝。

例如上面的例子:

 

 

接下来,在克隆结束后;我们改变这个address中的city属性,可以发现,两个对象的address属性都发生了变化,这也说明了Object类中的clone方法对于引用类型的属性,它复制的是地址。

    对于深拷贝--------------深拷贝于浅拷贝最大的区别在于,对于引用类型的属性;它不是拷贝地址,而是复制出另一个不同的对象。

下面示范一种实现深拷贝的方法:重写Object的clone方法。

首先通过Object类的clone方法克隆一个新的Person类对象;此时克隆出的对象中的address属性还是同一个;所以再拷贝出另一个address对象;用set方法将它设置为这个克隆出的对象的属性。

 

 接下来看一下输出结果:

 

 显然可以看到;两个对象的address属性并不是同一个;这就是深拷贝。一层一层深入复制;每一个对象都是拷贝出另一份;而不是简单的拷贝地址。

posted @ 2021-12-05 23:39  whisper_ac  阅读(422)  评论(0)    收藏  举报