刚注册博客,准备学习一下java源码,当然首先从Object看起。

介绍一下Object:

Object是所有类层次结构的根,所有的类都将Object作为超类。所有的对象,包括数组,都实现了Object类的方法。

下面介绍方法。

首先遇到了本地方法:

private static native void registerNatives();
    static {
        registerNatives();
    }

java的native方法自己实现一个Native方法的调用,好吧,暂时明白了,这是本地注册,调用非java语言的方法,一般是c/c++的dll文件,静态代码块就是加载本机器jdk里面的dll文件。

第二个方法:

public final native Class<?> getClass(),下面是方法注释:

注释写的很明白,Class类表示java应用实际运行时的类。

例子:

package Object.testPackage;
public class Test implements ITest {
    public static void main(String[] args) {
        Test test = new Test();
        ITest iTest = new Test();
        Class<? extends Test>  testClass = test.getClass();
        Class<? extends ITest> iTestClass = iTest.getClass();
        System.out.println("实现类-" + testClass);
        System.out.println("接口-"+iTestClass);
    }
}

结果如下:

第三个方法:

public native int hashCode();

这个方法返回对象的哈希码值,这个方法与哈希表的性能有关,它的实现方法是通过将对象在内存中所处于的位置转换成数字,这个数字就是hashCode。但是这个内存地址实际上java程序并不关心也是不可知的。这个地址是由JVM维护并保存的,所以实现是native的。通用的约定是:

  (1)在同个java环境下,相同的对象必须有同样的哈希码值;但是对于这个具体的整数值(哈希码)在两个相同应用下不需要一定要保持一致(后期会学到如何构建哈希表,一个对象在不同的哈希表下会有不同的哈希值)。

  (2)如果两个对象通过equals方法是相等的,则他们的哈希值相同。

  (3)反过来,如果两个对象通过equals方法是不相等的,他们的哈希值不一定不同。但是开发者应该明白,对于不相等的两个对象返回不同的哈希值会提高哈希表的性能。

该方法与java.lang.System下的identityHashCode方法作用相同。

第四个方法:

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

判断其它对象是否与此对象“相等 ”;如果一个对象要重写这个方法,需要与其它非空对象满足等价关系:以下的x,y,z均为非空对象

(1)自反性,x.equals(x)=true;

(2)对称性,x.equals(y) = y.equals(x);

(3)传递性,若x.equals(y) = true,y.equals(z) = true,则x.equals(z) = true;

(4)一致性,只要equals的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)就会一致地返回相同结果;

(5)x.equals(null) = false;

应当注意,当重写equals方法时,也要重写hashCode方法,这是为了确保相等的对象有相同的哈希码值。

public class HashCodeClass {
    
    private int code;

public void setCode(int code) {
        this.code = code;
    }
    
    public int hashCode(){
        return this.code;
    }
    
    public boolean equals(Object o){
        HashCodeClass temp = (HashCodeClass)(o);
        return this.code == temp.getCode();
    }

public int getCode() {
        return code;
    }
    
    public static void main(String[] args) {
        HashCodeClass hc = new HashCodeClass();
        HashCodeClass hc1 = new HashCodeClass();
        hc.setCode(100);
        hc1.setCode(100);
        System.out.println(hc.equals(hc1));
    }

}

结果:

Object源码分析(一)的更多相关文章

  1. JDK源码阅读(一):Object源码分析

    最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 has ...

  2. Object源码分析(二)

    第五个方法:protected native Object clone() throws CloneNotSupportedException; 源码简介: clone方法首先会判对象是否实现了Clo ...

  3. HashMap源码分析(一):JDK源码分析系列

    正文开始 注:JDK版本为1.8 HashMap1.8和1.8之前的源码差别很大 目录 简介 数据结构 类结构 属性 构造方法 增加 删除 修改 总结 1.HashMap简介 HashMap基于哈希表 ...

  4. JVM源码分析之Object.wait/notify实现

    ​ “365篇原创计划”第十一篇.   今天呢!灯塔君跟大家讲:   JVM源码分析之Object.wait/notify实现       最简单的东西,往往包含了最复杂的实现,因为需要为上层的存在提 ...

  5. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  6. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  7. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  8. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  9. ABP源码分析四:Configuration

    核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...

随机推荐

  1. Unity引擎GUI之Text

    Text 文本 要显示的字符串. Font 字体 Font Style 加粗与倾斜 Font Size 字体大小 Line Spacing 行距,文本行之间的间距 Rich Text 勾选后,想要单独 ...

  2. set statistics profile on实例

    set statistics profile on实例 1.SQL语句实例   SQL 代码   复制 SET STATISTICS PROFILE ON GO SELECT COUNT(b.[Sal ...

  3. VHDL之User-defined data types

    VHDL allows the user to define own data types. 1 user-defined integer types -- This is indeed the pr ...

  4. Verification之PSL之intro

    1 PSL - Property specification language 1.1 Property - Characteristics of the designs/verification e ...

  5. mysql手册操作

    1.show table status   显示表状态 2.VERSION()   版本:CURRENT_DATE   当前日期: NOW()   当前时间:USER   当前用户 3.GRANT A ...

  6. 【sqli-labs】 less5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)

    双注入查询可以查看这两篇介绍 https://www.2cto.com/article/201302/190763.html https://www.2cto.com/article/201303/1 ...

  7. webpack command not found 的意外的坑 - 原因是从node开始

    写给自己做个记录: 弄了半天 执行了下面操作 npm install webpack -g 因为小白不懂原理,所以执行了好遍,结果还是如题, webpack command not found 网上搜 ...

  8. 切换原生appium里面H5页面

    #coding = utf-8from appium import webdriverimport time'''1.手机类型2.版本3.手机的唯一标识 deviceName4.app 包名appPa ...

  9. #MySQL数据库无法远程访问的问题

    在 Ubuntu上装了mysql,因为项目的数据库是mysql,将项目放在tomcat里面webapp下面,一直启动不成功.本来一直以为是jdbc驱动问题,后来发现不是. 感谢!!http://blo ...

  10. @Transactional 注解的使用和注意

    转载:http://epine.itpub.net/post/8159/526281 1. 在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口 ...