深入浅出Java Object源码

深入浅出JDK 源码 深入浅出JDK(书籍源码,无书籍内容) 作者: 涂传滨 丛书名: Java技术大系 出版社:电子工业出版社 简介:从Java语言的特点、语法、开发环境入手,深入讲解如何利用JDK提供的API进行应用开发,如输入输出、线程、图形界面、数据库存取、XML等,详细阐述Java语言的高级开发技巧,如分布式计算、本地调用、Annotation、反射、动态代理、JMX等。 立即下载

Java中的Object

Java中的Object类位于java.lang包中,每一个Java类直接或者间接继承自Object,如果一个类没有继承任何类,那么该类默认直接继承Object,如果一个类继承了某一个类,那么Object间接继承了Object,因此所有Java对象都可以访问Object中定义的方法,因此Object是所有类的顶级父类。

Object源码解析

toString方法,返回该对象的String表示,Object中的toString方法返回类名+@+hashCode的无符号16进制

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

推荐开发中一般都会重写子类中的toString方法,使其更有意义,注意当输入对象时,默认调用对象的toString方法

Student s = new Student();

// Below two statements are equivalent
System.out.println(s);
System.out.println(s.toString());

println源码如下

/**
 * Prints an Object and then terminate the line.  This method calls
 * at first String.valueOf(x) to get the printed object's string value,
 * then behaves as
 * though it invokes <code>{@link #print(String)}</code> and then
 * <code>{@link #println()}</code>.
 *
 * @param x  The <code>Object</code> to be printed.
 */
public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (this) {
        print(s);
        newLine();
    }
}

hashCode方法详解,对于每一个对象,JVM生成一个独一无二的数字-hashCode,它为不同的对象返回不同的整数,一个普遍错误的理解就是该方法返回对象的内存地址,这样的理解是不对的,他使用某种算法把对象内存地址转换为整数,即hashCode,hashCode方法是native的,因为java无法操作内存地址,所以java底层是使用C/C++访问对象的内存地址,故他的源码无法观看,你需要下载openjdk才可以查看源码
hashCode的使用: 返回用于搜索集合中的对象的哈希值。 JVM(Java虚拟机)使用哈希码方法,同时将对象保存为散列相关的数据结构,如HashSet,HashMap,Hashtable等。基于哈希码保存对象的主要优点是搜索变得容易。

public native int hashCode();

不能根据hashCode值判断是否是同一个对象,如以下代码,虽然他们的hashCode是一样的,但是他们不是同一个对象

String firstStr = new String("hashCode");
String secondStr = new String("hashCode");

System.out.println(firstStr == secondStr); //false
System.out.println(firstStr.hashCode()); //147696667
System.out.println(secondStr.hashCode()); //147696667

为什么他们的hashCode是一样的呢,看源码如下

/**
 * Returns a hash code for this string. The hash code for a
 * {@code String} object is computed as
 * <blockquote><pre>
 * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
 * </pre></blockquote>
 * using {@code int} arithmetic, where {@code s[i]} is the
 * <i>i</i>th character of the string, {@code n} is the length of
 * the string, and {@code ^} indicates exponentiation.
 * (The hash value of the empty string is zero.)
 *
 * @return  a hash code value for this object.
 */
public int hashCode() {
    //hash默认是0
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        //s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

为什么源码中使用了质数31,这里找了一片博文why 31
所以从源码得出,相同的字符串内容的hashCode的值是一样的,即使他们不是同一个对象,再看以下比较特殊的几个例子,结果看源码就可以知道了

System.out.println("".hashCode()); //0
System.out.println("a".hashCode()); //97
System.out.println("A".hashCode()); //65
System.out.println("aA".hashCode()); // 3072

equals方法,Object默认是判断是否是同一个对象,所以如果子类没有重写,默认比较是否是同一个对象

public boolean equals(Object obj) {
    return (this == obj);
}

例子

Object object = new Object();

System.out.println(object.equals(object)); //true
System.out.println(object.equals(null)); //false

getClass方法,返回“this”对象的类对象,用于获取对象的实际运行时类。它还可用于获取此类的元数据。返回的Class对象是由所表示的类的静态同步方法锁定的对象。因为它是final的所以我们不会覆盖它。

Object obj = new String("github/shellhub");
Class cls =obj.getClass();
System.out.println(cls.getName());

finalize()方法,在对象被垃圾收集之前调用此方法。当垃圾收集器确定没有对该对象的更多引用时,垃圾收集器会在对象上调用它。我们应该覆盖finalize()方法来处理系统资源,执行清理活动并最小化内存泄漏。例如,在销毁Servlet对象web容器之前,总是调用finalize方法来执行会话的清理活动。
注意:即使该对象有多次符合垃圾回收条件,对象也只调用一次finalize方法。

public class Test {
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(t.hashCode());

        t = null;

        // calling garbage collector
        System.gc();
        System.out.println("end");
    }

    @Override
    protected void finalize() {
        System.out.println("finalize method called");
    }
}

注意finalize方法不一定会执行,多试几次

clone方法用于克隆一个和该对象完全一样的新对象

深入浅出JDK源码 深入浅出JDK本书 自带光盘 深入浅出JDK本书 自带光盘 立即下载

相关推荐

Head First_深入浅出Java(中文第2版)_带书签_高清完整版 4980

[美] Kathy Sierra 等 著; 文件大小:63.37MB

《从面试题来看源码》,单参数,多参数,如何正确使用@Param

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34115824的博客 326

Java JSON与Object互转源代码

高效的JSON与Object互转的工具源代码,如果JSON数据未按该工具规定的数据格式转化成对象,将转化成java.util.Map实例。 (比JSON官方的API更适用。支持对象之间的多级引用,支持Map, List等集合。不需要引用其它中间对象。) 该代码通过两个简单的方法进行JSON数据与Java对象之间简单转化: 1. String jsonStr = JSONTool.convertObjectToJson(object); 2. Object obj = JSONTool.convertJsonToObject(jsonStr); 缺点:对于集合(Collection,非Map)类数据结构,不能在集合中包含其他集合对象,但是可以包含数组。

Java Object类源码分析

获取源码的方式:https://blog.youkuaiyun.com/weixin_35946648/article/details/114849170 注意:后文中提到的所有路径均为源码根目录的相对路径。 1、registerNatives() 方法作用:向JVM注册Object类中的其他一系列native方法。 源码实现(jdk/src/share/native/java/lang/Object.c): 源码分析: (1)JNIEnv 即 JNI 环境,用于在 c/c++ 代码中调用 java

潇湘如梦的博客 348

Java Object实例代码

Java Object实例代码 Java Object知识点分成7部分:对象、继承多态、构造器、类包内外访问权限、各种静态内部类、抽象函数、接口

Oracle ERP EBS R12 GL总帐业务方案 系统操作

本文档是Oracle ERP系统的总账管理模块使用手册,主要包含以下内容:1.系统架构设计,详细介绍多组织架构、会计科目设置等核心概念;2.总账日常操作流程,包括凭证录入、审核、过账等全流程管理;3.特殊业务处理,涵盖预算控制、内部往来、合并报表等专项功能;4.期末处理,说明月结、年结的操作步骤;5.系统设置指南,提供会计科目表、权限控制等配置说明;6.附录包含各业务模块的分录示例和系统操作图标说明。本手册适用于财务人员学习和使用Oracle ERP总账系统,重点讲解系统功能要点和实操步骤。

anpeng2019的博客 1888

Object类九大方法之notify和notifyAll方法

Object类九大方法之notify和notifyAll方法 notify()方法表示,当前的线程已经放弃对资源的占有, 通知等待的线程来获得对资源的占有权,但是只有一个线程能够从wait状态中恢复,然后继续运行wait()后面的语句;只会唤醒等待该锁的其中一个线程。 notifyAll()方法表示,当前的线程已经放弃对资源的占有, 通知所有的等待线程从wait()方法后的语句开始运行; 唤醒等待...

TimeFriends 2865

ElasticSearch集群搭建

docker安装es集群

weixin_46562226的博客 2026

Java-Object类源码解析

Class Object是类层次结构的根。每个Class都有Object作为超类。所有对象(包括数组)都实现了这个类的方法。

sdrfghb的博客 1071

PLECS中DLL模块的使用

PLECS中DLL模块的使用 之前发布了一篇文章,介绍如何使用PSIM中的DLL模块。而本篇文章的内容与之类似,不过主角换成了PLECS。 PLECS和PSIM类似,也属于电力电子仿真软件,使用方便,仿真速度快,和Matlab也有一定的联系,有兴趣的可以去试试。PLECS可以利用外部动态链接库(DLL)来调用外部的代码参与仿真,方便复杂控制算法的实现,也有利于后期直接将代码移植到硬件控制器上。

OptimisticPoplar的博客 2716

概率论—期末复习速成笔记(自用)

概率论期末复习

a200327的博客 2万+

Object类源码理解

java源码理解。

ewbie的博客 1333

【AI助力科研】不看一篇文献,手把手教你用chatGPT写文献综述!

这篇文章以【AI助力科研】为题,介绍了如何利用ChatGPT编写文献综述的方法。作者通过详细的指导,展示了不需要阅读大量文献,只需依靠ChatGPT模型即可完成文献综述的过程。该方法旨在提高科研工作者的效率,减少阅读负担,并且能够生成具有逻辑性和准确性的文献综述。

研究方向//图像视频处理/信号算法/红外无损检测/数值仿真/机器学习/优化算法/python/matlab 2万+

Object.equals()、Object.equals(a,b)、Objects.deepEquals(a,b)的区别

不同equals方法的区别

weixin_42466157的博客 302

大津法(OTSU)点云强度信息分割

大津法(OTSU)是一种灰度图像自适应的阈值分割方法,大津法根据图像的灰度分布,将图像分成背景和前景两部分,前景就是需要按照阈值分割出来的部分。由于点云的强度信息的特性,也可以利用此方法进行分类,但需要保证信息干扰较少,例如道路标线分割等场景较为适用。

qq_48694523的博客 966

OSG程序如何适配在无显卡的Ubuntu系统中

osg踩坑,希望遇到同样问题的人,可以尽快出坑,完美开发

大侠的后花园 459

JUC并发编程——AQS源码解读

1、AQS是什么? 2、LockSupport的使用 3、结合ReentrantLock分析AQS源码

weixin_39555954的博客 967

十九、帧间预测编码_2、解码、显示顺序与图像管理、参考帧管理

一、基本概念 1.1H.264的解码顺序和显示顺序: 解码过程中,每一帧的数据按照相应的NAL Unit在码流中的顺序传入解码器进行解码 由于B帧的存在,视频帧在输出时会进行顺序重排 1.2frame_num与POC frame_num:表示解码顺序 POC:表示显示顺序(picture_order_count) 在H.264的码流中,表示解码顺序和显示顺序分别有相应的语法元素表示。这两个值都会在码流中保存,并在读取slice信息时解析(SliceHeader中) 1.3参考帧列表 某一帧图像在解

叮咚的博客 1330

深入浅出Java线程池(下)源码解析篇

在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用。(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适)。本文则深入线程池的源码,主要是介绍ThreadPoolExecutor内部的源码是如何实现的,对ThreadPoolExecutor有一个更加清晰的认识。ThreadPoolExecutor的源码相对而言比较好理解,没有特别难以读懂的地方。相信没有阅读源码习惯的读者,跟着本文,也可以很轻松地读懂ThreadPoolExecutor的核心源码逻辑。

hirezy 1652

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

深入浅出Java集合

深入浅出Java集合 1.集合框架概述 集合、数组都是对多个数据进行存储操作的结构,简称Java容器。 说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中) 数组在存储多个数据方面的特点: 一旦初始化以后,其长度就确定了。 数组一旦定义好,其元素的类型也就确定了。我们也就只能操作指定类型的数据了。 比如:String[] arr; int[] arr1; Object[] arr2; 数组在存储多个数据方面的缺点: 一旦

xingranzhihuo的博客 336

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

深入浅出Java线程池:源码篇

前言 在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用。(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适)。本文则深入线程池的源码,主要是介绍ThreadPoolExecutor内部的源码是如何实现的,对ThreadPoolExecutor有一个更加清晰的认识。 ThreadPoolExecutor的源码相对而言比较好理解,没有特别难以读懂的地方。相信没有阅读源码习惯的读者,跟着本文,也可以很轻松地读懂ThreadPoolExecutor的核心源码逻辑。

chuyouyinghe的专栏 183

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java semaphore 源码_深入浅出Semaphore源码解析

本文将为您描述深入浅出Semaphore源码解析,具体实现方法:Semaphore通过permits的值来限制线程访问临界资源的总数,属于有限制次数的共享锁,不支持重入。前提条件在理解Semaphore时需要具备一些基本的知识:理解AQS的实现原理之前有写过一篇《深入浅出AQS源码解析》关于AQS的文章,对AQS原理不了解的同学可以先看一下Semaphore源码解析Semaphore中有3个内部类...

weixin_34690611的博客 237

深入浅出Spring源码,这次终于把学Spring源码的技巧吃透了!

后续还有很多教程内容,都是由本人录制的,这里就不一一列举了!对Spring源码感兴趣的小伙伴可以关注下博主后台私信“Sprin源码”通过小助理发你,另外我也成立了自己的社qun,在学习过程中有不懂的问题可以咨询博主解答(无任何套路)

2401_84917132的博客 1715

深入浅出Java 锁 | 源码剖析 | 万字解析

Java中有哪些锁?本文围绕这个问题进行深入的探讨,从内存模型到乐观悲观锁,再到底层源码实现(Java8版本)

qq_74092815的博客 1092
上一篇: 设计模式之单例模式
下一篇: Room SQLite持久层框架
ishellhub
博客等级 码龄9年 102粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值