JDK源码阅读开始--Object类
Posted 浪师傅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK源码阅读开始--Object类相关的知识,希望对你有一定的参考价值。
这是jdk1.7src 源码包解压出来的架构。
1:java.lang 是语言包,是java的核心包,系统自动回将此包的类引入到java程序中,其中包含所有类的父类 Object 类,数据类型包装类,数学类Math,字符串类,系统和运行时类,线程类,错误和异常类,过程类。java平时用到的类,大部分都在这个包下。
2:java.util 实用包类,提供了各种实用功能的类,关于日期类,数据结构类的一些实现类。
3:java.awt 抽象窗口工具包。
4:java.swing 轻量级窗口工具包。
5:java.io 输入输出包。这个是阻塞的io。
6:java.net 网络函数包。关于socket, tcp udp 这些协议的连接类在这。
7:java.nio java 新IO 或者叫非阻塞IO.利用selector 、channel 、buffer 实现非阻塞。Netty框架就是根据这个实现的。
8:java.sql 关于数据库的连接,执行,事务都在这个包下。
9:java.rmi java Remote Method Invocation 远程方法调用 ,就是调用远程服务器上的对象。
10:java.security 关于安全框架类的实现。
java.* 属于标准库,所有厂家实现的jdk,java.*里的类是一样的。
javax.* 是java.*的扩展,为了防止java标准库过大。
其他包下的是关于虚拟机已经企业提供的java类库.
先学习java.lang 下的类。
(1)Object 类
Object 类是java其他所有类的父类,第一基类。
其属性方法结构如下图:
①最开始有个本地静态方法registerNatives() ,以及静态代码块直接执行registerNatives();在java中,被native修饰的方法,就是不用java代码实现了,使用其他语言,比如C语言去实现,在java中只需要声明。百度得知,这个方法是java虚拟机创建对象的一些基本操作:分配内存空间,定义变量,产生this指针等等。
②然后又是一个native方法getClass()
返回值是Class类型,通过Class类对象可以获取到改类的方法和属性,以及构造方法都可以。类是程序的一部分,每个类都有一个Class对象。得到类的Class对象除了调用当前对象的getClass()方法以外,还有俩种,通过类的class属性,任意一个类都有一个class属性;通过Class.forName(),传入类的全路径即可。
Class对象与反射机制的关系,java反射机制就是在运行状态中,对于任意一个类,都能知道这个类的属性和方法,对于任意一个对象,都能都调用它的任意方法和属性,这种动态获取类的信息以及动态调用对象的功能就是java的反射机制。
③hashCode()方法以及equals()方法
hashCode()是为了获取对象的哈希吗,或者叫散列码,就是一个int类型的整数,通过哈希吗确定该对象在哈希表中的索引位置。哈希表是为了在散列结构的容器中存储对象的时候使用。
这里就有俩种情况:
一:当我们不使用散列结构的容器存储此类对象,就不会有哈希表。这种情况下,equals和hashcode方法没有任何关系。当然,我们可以覆写equals方法用来比较俩个对象是否相等,俩个对象equals返回true和false对hashcode方法没有任何影响。
二:当我们使用hashMap 散列数据结构存储此类对象时,就会创建类对应的哈希表。这种情况下,对象的equals方法为true,hashcode也一定为true; equals方法为false,hashcode可能为false,也可能为true,毕竟int类型的整数就那么多,有极小极小的概率可能返回一样的哈希码。也就是说俩个对象hash值一样,equals并不一定返回true。
当往hashMap这样的散列结构添加数据的时候。只有当equals 和 hashcode 都为 ture,才认为俩个对象是相等的。先直接根据哈希值插入到对应的位置,如果哈希值相同,说明有可能是相同的对象了,还需要通过equals方法进行确定,如果通过equals方法比较也是ture.就不添加此对象了,如果为false,就只是发生了hash冲突,但是就是俩个不同的对象,添加成功。
④:toString()方法,默认打印出 对象名+@+哈希值
⑤:clone()方法,拷贝一个java对象,分为深拷贝和浅拷贝。
⑥:wait() ,notify(),notifyAll() ,这些都是本地方法,被final修饰,无法被重写,都是关于线程调度的。wait()执行后,拥有当前锁的线程会释放锁,并进入等待状态,需要重新获取锁,notify()和notifyAll()会唤醒处于等待状态的线程去获取锁,notify()只是唤醒所有等待状态线程中的一个,notifyAll()会唤醒所有,让他们去抢线程锁。
⑦:finalize(),这个方法时对象生命周期最后执行的一个方法了,就是当对象的内存不使用时,java的垃圾回收机制回收之前会执行这个方法,但是回收的时间不一定。
Object类的所有方法,java的其他类都有。
以上是关于JDK源码阅读开始--Object类的主要内容,如果未能解决你的问题,请参考以下文章