理论上Object类是所有类的父类,即直接或间接的继承java.lang.Object类。由于所有的类都继承在Object类,因此省略了extends Object关键字。下面简单说一下object类中的方法
clone()方法
保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
主要是JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法(实现深复制)。
在说明一下深度clone和浅clone,我们的clone方法默认是浅clone,浅clone只会对基本数据类型进行clone,引用类型任然会公用同一个地址空间。深clone就是完全clone,不会公用一个地址空间。什么意思,举个例子,有一个类
class A{
}
那么A的对象就不是一个基本的数据类型,还有一个B,是我们要clone的对象的类
class B{
int b1;
int b2;
A ba1;
A ba2;
}
现在有一个B的对象b,我们需要clone一个b,如果是浅clone,我们直接调用clone()方法就ok,这样就会产生一个clone的对象,但是这个对象的四个属性中只有b1,b2是完全clone,和原对象中b1,b2除了数据一样,地址空间也不一样,而两个引用类型的属性ba1,ba2和原对象中的属性是一模一样的,指向同一个地址空间,那么这样就出现了交集,可能会出现我们不希望的结果,这个就是浅clone。而深clone的话除了基本数据类型,就是引用数据类型也会是新的地址空间,不会共享地址空间。这个时候需要我们自己重写clone()方法来实现深clone。
class B implements Cloneable {
public Object clone() throws CloneNotSupportedException {
B cloned = (B) super.clone();
cloned .ba1= A.clone()
cloned .ba2= A.clone()
return cloned;
}
}
toString()方法
例子:
<span data-wiz-span="data-wiz-span" style="font-size: 1.167rem;">package com.cal.toString; public class Test1 { public static void main(String[] args){ Object o1 = new Object(); System.out.println(o1.toString()); } } </span>
getClass()方法
finalize()方法
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
Java允许在类中定义一个名为finalize()的方法。它的工作原理是:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法。并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
关于垃圾回收,有三点需要记住:
1、对象可能不被垃圾回收。只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。
2、垃圾回收并不等于“析构”。
3、垃圾回收只与内存有关。使用垃圾回收的唯一原因是为了回收程序不再使用的内存。
equals()方法
如果是同一块内存,则object中的equals方法返回true,如果是不同的内存,则返回false
如果希望不同内存但相同内容的两个对象equals时返回true,则我们需要重写父类的equal方法
String类已经重写了object中的equals方法(这样就是比较内容是否相等了)
hashCode()方法
该方法用于哈希查找,可以减少在查找中使用equals的次数,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
如果不重写hashcode(),在HashSet中添加两个equals的对象,会将两个对象都加入进去