Object源码分析(一)
刚注册博客,准备学习一下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源码分析(一)的更多相关文章
- JDK源码阅读(一):Object源码分析
最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 has ...
- Object源码分析(二)
第五个方法:protected native Object clone() throws CloneNotSupportedException; 源码简介: clone方法首先会判对象是否实现了Clo ...
- HashMap源码分析(一):JDK源码分析系列
正文开始 注:JDK版本为1.8 HashMap1.8和1.8之前的源码差别很大 目录 简介 数据结构 类结构 属性 构造方法 增加 删除 修改 总结 1.HashMap简介 HashMap基于哈希表 ...
- JVM源码分析之Object.wait/notify实现
“365篇原创计划”第十一篇. 今天呢!灯塔君跟大家讲: JVM源码分析之Object.wait/notify实现 最简单的东西,往往包含了最复杂的实现,因为需要为上层的存在提 ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
- java使用websocket,并且获取HttpSession,源码分析
转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...
- ABP源码分析四:Configuration
核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...
随机推荐
- Android开发笔记(10)——使用Fragment传递
转载请注明:http://www.cnblogs.com/igoslly/p/6911165.html 由于最近废寝忘食地在开发App,没来得及及时做总结,没有用很高级的部件,勉强也使用一些功能完成了 ...
- CSS框架Bootstrap
作为一个软件开发人员,经常接触和使用框架是再平常的事情不过了.但是这些框架基本都是和语言相关的,比如WEB框架SpringMVC,JavaEE框架Spring,ORM框架Hibernate,还有Jav ...
- 三维重建:SLAM算法的考题总结
参考英文维基:https://en.wikipedia.org/wiki/Slam 参考文档:视觉slam研究分析的一点认识 1. 请简单描述您对机器人的SLAM的概念理解? 答: 机器人需要在自身位 ...
- 时序分析:串匹配—Brute-Force算法
在使用KMP算法之前,使用了BF算法用于串匹配:原文链接已无法查找..... 设有主串s和子串t,子串t的定位就是要在主串s中找到一个与子串t相等的子串.通常把主串s称为目标串,把子串t ...
- iproute2和tc的高级路由用法
#Linux advanced router ip link show #显示链路 ip addr show #显示地址(或ifconfig) ip route show #显示路由(route -n ...
- List分组的两种方式
java8之前List分组 假设有个student类,有id.name.score属性,list集合中存放所有学生信息,现在要根据学生姓名进行分组. public Map<String, Lis ...
- eas中删除原来的监听事件添加新的监听事件
kdtEntrys.removeKDTEditListener(kdtEntrys.getListeners(KDTEditListener.class)[0]); kdtEntrys.addKDT ...
- 【剑指Offer】55、链表中环的入口结点
题目描述: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 解题思路: 本题是一个比较典型的链表题目,难度适中.首先,对于大多人来说,看到这道题是比较开心的 ...
- 类的定义与实例化、构造函数和初始化表(day04)
十三 类的定义与实例化 类的一般形式 class/struct 类名:继承表{ 访问控制限定符: 类名(形参表):初始化表{}//构造函数 ~类名(void){}//析构函数 返回类型 函数名(形参表 ...
- 今天写了一个简单的新浪新闻RSS操作类库
今天,有位群友问我如何获新浪新闻列表相关问题,我想,用正则表达式网页中取显然既复杂又不一定准确,现在许多大型网站都有RSS集合,所以我就跟他说用RSS应该好办一些. 一年前我写过一个RSS阅读器,不过 ...