JDK 源码之 Object - buaa_czw
1、Object 类简介
native 为 java 的一个关键字
JNI:Java Native Interface ,从 Java1.1 开始,JNI 标准成为 java 平台的一部分,它允许 Java 代码和其他语言写的代码进行交互,例如 C 或者 C++ 代码。
2、源码
2.1、getClass 方法
getClass() 方法返回对象运行时类。
2.2、hashCode 方法
hashCode() 返回对象的 hash 值,为 int 类型。那么对象创建好之后何时计算 hashCode 值?计算出的 hashCode 的值存放在那里呢?那么我们来看一下一个 java 对象组成 。
对象由对象头(对象头包括 Mark Word 和 Class Pointer 类型指针)、实例数据、对齐填充部分组成,数组对象比较特殊,会多数组长度部分。对齐填充部分时为了保证对象的大小是 8 字节的整数倍。
对象头中 Mark Word 用于存储对象自身的一些数据,具体存储信息如下图所示,对象头的大小在不同的虚拟机上的大小有所差异,通常为 32bit 或者 64bit。
对象的 hashCode 值是在对象使用时调用 hashCode 函数时计算,并不是对象创建时就计算好的。
2.3、equals 方法
由源码可以看出,在 Object 这个类中,equals() 方法和==是相同的,比较的是两个对象的引用是否相同。
我们比较两个字符串是否相等时,需要比较字符串本身的内容是否相等,而不希望比较字符串的引用地址是否相同,所有 String 类重写了 equals() 方法,让我一起看看源码。
如果在程序开发中需要比较对象的属性值是否相同,应该重写 Object 的 equals 方法,否则会调用 Object 的 equals 方法,使用==比较两个对象引用地址是否相同。
2.4、clone 方法
该方法实现对象的浅拷贝,使用 clone() 方法时,记得捕获 CloneNotSupportedException 异常,或者在类上实现 Cloneable 接口但不抛出该异常(尽管这在实际操作中不常见)。此外,使用 clone() 方法时要小心,因为它可能会导致性能问题或者在复杂对象图中出现问题(比如循环引用)。在 Java 中,通常推荐使用构造器或拷贝构造函数来实现浅拷贝或深拷贝,特别是在处理复杂对象时。。
浅拷贝(Shallow Copy)指的是创建一个新的对象,然后将原始对象的数据(字段)复制到新对象中。如果原始对象的字段是值类型(如 int、double 等基本数据类型,或者它们的包装类如 Integer、Double 等),这些值会被复制到新对象中。如果原始对象的字段是引用类型(如对象、数组等),那么这些引用类型的字段不会被复制其内容,而是复制引用本身的地址。这意味着新的对象和原始对象将引用同一个内存地址。
深拷贝:不仅复制对象本身,还递归地复制对象内部引用的所有对象。这意味着原始对象和副本对象不会共享任何引用指向的对象。
2.5、finalize 方法
当一个 Java 对象被垃圾回收器标记为不再使用时,垃圾回收器会调用对象的 finalize() 方法来清理这个对象。但是垃圾回收器并不保证会立马调用该方法,可能会在后面某个何时的时间再调用。