擘塞 发表于 2025-8-7 21:32:35

JDK源码之Object

1、Object类简介

  java中所有的类都会继承Object类,属于java.lang包。<br>  Object类提供的方法如下:其中registerNatives()、getClass()、hashCode()、clone()、notify()、notifyAll()、wait(long timeout)为native方法,后面挑几个重要的方法讲一下。<br><br>     native 为java的一个关键字
  JNI:Java Native Interface ,从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互,例如C或者C++代码。
  
2、源码

2.1、getClass方法 

public final native Class<?> getClass();  getClass()方法返回对象运行时类。
2.2、hashCode方法

public native int hashCode();  hashCode()返回对象的hash值,为int类型。那么对象创建好之后何时计算hashCode值?计算出的hashCode的值存放在那里呢?那么我们来看一下一个java对象组成 。
  
  对象由对象头(对象头包括Mark Word 和 Class Pointer类型指针)、实例数据、对齐填充部分组成,数组对象比较特殊,会多数组长度部分。对齐填充部分时为了保证对象的大小是8字节的整数倍。  
  对象头中Mark Word用于存储对象自身的一些数据,具体存储信息如下图所示,对象头的大小在不同的虚拟机上的大小有所差异,通常为32bit或者64bit。
  对象的hashCode值是在对象使用时调用hashCode函数时计算,并不是对象创建时就计算好的。
  
  
 
2.3、equals方法

public boolean equals(Object obj) {
      return (this == obj);
    }  由源码可以看出,在Object这个类中,equals()方法和==是相同的,比较的是两个对象的引用是否相同。
  我们比较两个字符串是否相等时,需要比较字符串本身的内容是否相等,而不希望比较字符串的引用地址是否相同,所有String类重写了equals()方法,让我一起看看源码。
    public boolean equals(Object anObject) {
      if (this == anObject) { //如果引用的地址相同,那么这两个字符串必然相同,直接返回true
            return true;
      }
      if (anObject instanceof String) {//判断对象是否为String类型
            String anotherString = (String)anObject;//强转为String对象
            int n = value.length;//获取对象长度
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) { //依次比较每个字符
                  if (v1 != v2)
                        return false; //有一个不相同则返回false
                  i++;
                }
                return true; //内容完全,返回true
            }
      }
      return false; //不是String对象直接返回false
    }  如果在程序开发中需要比较对象的属性值是否相同,应该重写Object的equals方法,否则会调用Object的equals方法,使用==比较两个对象引用地址是否相同。
2.4、clone方法

protected native Object clone() throws CloneNotSupportedException;  该方法实现对象的浅拷贝,使用clone()方法时,记得捕获CloneNotSupportedException异常,或者在类上实现Cloneable接口但不抛出该异常(尽管这在实际操作中不常见)。此外,使用clone()方法时要小心,因为它可能会导致性能问题或者在复杂对象图中出现问题(比如循环引用)。在Java中,通常推荐使用构造器或拷贝构造函数来实现浅拷贝或深拷贝,特别是在处理复杂对象时。。
   浅拷贝(Shallow Copy)指的是创建一个新的对象,然后将原始对象的数据(字段)复制到新对象中。如果原始对象的字段是值类型(如int、double等基本数据类型,或者它们的包装类如Integer、Double等),这些值会被复制到新对象中。如果原始对象的字段是引用类型(如对象、数组等),那么这些引用类型的字段不会被复制其内容,而是复制引用本身的地址。这意味着新的对象和原始对象将引用同一个内存地址。
  深拷贝:不仅复制对象本身,还递归地复制对象内部引用的所有对象。这意味着原始对象和副本对象不会共享任何引用指向的对象。
2.5、finalize方法

protected void finalize() throws Throwable { }  当一个Java对象被垃圾回收器标记为不再使用时,垃圾回收器会调用对象的finalize()方法来清理这个对象。但是垃圾回收器并不保证会立马调用该方法,可能会在后面某个何时的时间再调用。
  
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

邰怀卉 发表于 2025-10-16 10:17:36

谢谢分享,辛苦了

荡俊屯 发表于 2025-10-24 18:03:52

懂技术并乐意极积无私分享的人越来越少。珍惜

箝德孜 发表于 2025-12-8 10:03:04

过来提前占个楼

秤陷曲 发表于 2025-12-12 12:07:28

谢谢楼主提供!

啦汇 发表于 2025-12-16 23:30:00

感谢发布原创作品,程序园因你更精彩

甘子萱 发表于 2025-12-24 22:24:13

感谢,下载保存了

捡嫌 发表于 2025-12-29 01:16:38

谢谢分享,辛苦了

唐嘉懿 发表于 2026-1-14 01:41:20

新版吗?好像是停更了吧。

辉伫 发表于 2026-1-15 18:16:31

东西不错很实用谢谢分享

裸历 发表于 2026-1-17 20:07:01

用心讨论,共获提升!

染悄 发表于 2026-1-21 02:12:38

这个有用。

都淑贞 发表于 2026-1-21 04:44:28

感谢分享

瞪皱炕 发表于 2026-1-21 05:26:59

不错,里面软件多更新就更好了

水苯 发表于 2026-1-27 02:00:31

前排留名,哈哈哈

咪四 发表于 2026-1-27 08:50:56

前排留名,哈哈哈

打阗渖 发表于 2026-1-30 02:57:31

鼓励转贴优秀软件安全工具和文档!

喳谍 发表于 2026-2-3 10:38:22

感谢分享,学习下。

官厌 发表于 2026-2-5 07:19:50

谢谢分享,辛苦了

珠尿娜 发表于 2026-2-6 08:52:46

感谢分享,下载保存了,貌似很强大
页: [1] 2
查看完整版本: JDK源码之Object