Java基础知识(3)-Object类
我们知道Java有两种数据类型,基本类型和引用类型。基本类型已经在我之前的博客介绍过了,这里就不细说了。那么另外一种类型是引用类型,在Java中所有引用类型的父类都是Object类,也就是说在我们所写的Java代码中,Object类是继承树的根节点。那么掌握Object类的方法对于我们来说是很有必要的。这里我们不考虑线程相关的方法notify
、notifyAll
、wait
。
hashCode
我们可能都听说过什么重写了equals
方法必须重写hashCode
方法,那么什么是hashCode
方法。首先我们得了解哈希表这种数据结构。
我们都知道数组是基于下标索引来访问存储单元的值(index - value
),这种存储方式很不方便,所以计算机科学家研究出了哈希表这种数据结构,它是通过一个唯一索引来访问存储单元的值(key - value
),那么哈希表的key
就叫做哈希值。
在Jvm
中所有使用new
操作符的对象实例都被分配到了堆Heap
中,在堆里面有很多的对象实例,如果我们有一个值key
可以唯一定位到堆内存中的对象,是十分方便实际开发的。所以hashCode
方法返回的就是这个key
。
equals
在Object中这个equals方法其实判断的是对象是否指向同一个内存地址,那么也就只有对象本身才满足这种情况。源码如下:
public boolean equals(Object obj) {
return this == obj;
}
那么这个方法在某些情况下并不适用,比如两个对象的属性一样我们就认为它是相等的。所以在实际开发中,我们可能会重写equals方法。
toString
toString
方法就是它的字面意思,返回这个对象的字符串形式。那么在Object类中返回的是类名称和它的哈希值的十六进制形式,源码如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
实际开发中,大多数情况我们会重写toString
方法,打印对象的状态信息。
getClass
getClass
方法是Object类中比较特殊的一个方法,它特殊就特殊在getClass
是一个泛型方法,它返回的是实例对象的类对象,源码如下:
public final native Class<?> getClass();
clone
clone
方法,这个方法也比较特殊,想要使用它必须实现Cloneable
接口。这里有个设计模式叫做原型模式,所谓的原型模式就是以一个对象为模板快速生成一个新的对象。clone
方法返回的是一个浅拷贝的对象。
finalize
finalize
方法算是一个比较没用的方法,我们都知道Java是一个有垃圾回收的语言,所以我们Java程序员并不会关心什么时候回收一个对象,因为这些都由GC帮我们做了。finalize方法就是在GC回收对像前一刻调用,执行相关的清理操作,有点像C++里面的析构函数,可是在Java里面一个对象什么时候回收是不确定的,所以这个方法用处不大,我们更多时候是手动调用资源close方法关闭。