JDK源码之lang.object(一)

本文从JDK源码出发,详细解读Object类的关键方法,包括registerNatives()的本地方法注册、getClass()获取运行时类、hashCode()生成哈希码、equals()比较相等性、clone()创建对象副本以及toString()返回对象字符串表示。这些方法是所有Java对象的基础,理解它们有助于提升编程能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近想要开始看jdk的源码,就先从Object类开始看吧。

Object类是类结构的根,Object类是所有类的父类,所有的对象,包括数组都实现了这个类的方法。

Object类的方法有哪些呢?

 1.先来看一下源码中registerNatives()方法:

 作用:对几个本地方法进行注册(也就是初始化java方法映射到C的方法)。

解释:从上面的代码中看到Object类定义了一个静态初始化块,我们知道当创建Java对象时,系统总是先调用静态初始化块

在上面的静态初始化块中调用了registerNatives()方法,并且使用了private来修饰,表面这个方法是私有的并不被外部调

用。在Java中使用native关键字修饰的方法,说明此方法并不是由Java中完成的,而是通过C/C++来完成的,并被编

译成.dll,之后才由Java调用。方法的具体实现是在dll文件中,当然对于不同平台实现的细节也有所不同,以上

registerNatives()方法主要作用就是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。

 2.Object类中的getClass()方法:

作用:返回对应的当前正在运行时的类所对应的对象

示例:

package com.ftl810;

import java.util.Date;

class Test extends Date{
    private static final long serialVersionUID = 1L;
    public static void main(String[] args) {
        new Test().print();
         
    }
    
    public void print(){
        System.out.println("当前运行类的名字为:"+super.getClass().getName());
        System.out.println("当前运行类的名字为:"+this.getClass().getName());
        System.out.println("当前运行类的继承的父类的名字为:"+this.getClass().getSuperclass().getName());
         
     
    }
}

输出结果:

返回对应的当前正在运行时的类所对应的对象,那么super可以理解为Test的父类Date,那么请问当前Date类正在运行时的对象是谁?没错,就是其子类Test,所以this.getClass(0.getName()和super.getClass().getName()返回的是com.ftl810.Test

再看看getSuperClass():返回当前实体类的父类。所以要返回当前类的父类的话,请使用下面这中方式

super.getClass().getSuperClass().getName();

 

3.Object类中的hashCode()方法:

作用:返回该对象的哈希码值。支持此方法是为了提高哈希表的性能。

package com.ftl88;

public class Test {

	public static void main(String[] args) {
		String str="abc";
		System.out.println(str.hashCode());
		System.out.println(str.hashCode());
	}
}

解释:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。

 

4.Object类中的equals()方法:

Indicates whether some other object is "equal to" this one.意思是指示是否有其他的某个对象和这个对象相等

 Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 xy,当且仅当 xy 引用同一个对象时,此方法才返回 truex == y 具有值 true)。

此方法经常被重写,一般的当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

 

5.Object类中的clone()方法:

作用:创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。

对于任何对象x,表达式:
(1)x.clone() != x为true
(2)x.clone().getClass() == x.getClass()为true
(3)x.clone().equals(x)一般情况下为true,但这并不是必须要满足的要求

package com.ftl88;

public class Test implements Cloneable{

	public static void main(String[] args) throws CloneNotSupportedException {	
		Test t=new Test();
		System.out.println("t        :"+t);
		System.out.println("t.clone():"+t.clone());
		System.out.println("t.getClass()        :"+t.getClass());
		System.out.println("t.clone().getClass():"+t.clone().getClass());
		System.out.println(t.clone().equals(t));
		
		Integer in=526345;
		System.out.println(in.equals(in));
	}
}

 

 

6.Object类中的toString()方法:

 作用:toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:getClass().getName() + '@' + Integer.toHexString(hashCode())

 

package com.ftl810;

import java.util.Date;

class Test extends Date{
    private static final long serialVersionUID = 1L;
    public static void main(String[] args) {
	Object ob=new Object();
	System.out.println(ob.toString());
    }
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值