【小白的java成长系列】——顶级类Object源代码分析
首先来说一下api文档使用,api这个词对有一定开发经验的java编程人员来说是非常喜爱的~
java当然也提供了api开发文档,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 找到以下的:
下载自己喜爱的版本号就可以,解压,点击~/jdk-7u60-apidocs/api/index.html就能够查看其api了:
跟上网一样一样的,点击对应链接就能够查看其信息了。
进入正题,说说Object这个类:
先奉上去掉凝视的源代码:能够看到这里面出现了非常多nativekeyword,这个前面也有介绍,它是调用本地的方法,这边说得直白一点,就是调用jvm底层的方法,也是C/C++方法的,我们知道,jvm非常大程度上是依赖于C/C++开发出来的~
package java.lang;
public class Object {
private static native void registerNatives();
static {//静态块,默认调用registerNatives()方法
registerNatives();
}
<span style="white-space:pre"> </span>//返回执行时的Class,一般在反射过程中用的比較多
public final native Class<?> getClass();
<span style="white-space:pre"> </span>//得到jvm执行时的hash值
public native int hashCode();
<span style="white-space:pre"> </span>//比較方法,两个对象进行比較
public boolean equals(Object obj) {
return (this == obj);
}
<span style="white-space:pre"> </span>//克隆方法
protected native Object clone() throws CloneNotSupportedException;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>//转换成String,这个就说明了为什么我们在打印对象的时候,控制台会看到xx@xxx的信息,事实上是调用的是这种方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
<span style="white-space:pre"> </span>//唤醒线程,即唤醒某个处于睡眠的线程——>对象的线程
public final native void notify();
<span style="white-space:pre"> //唤醒</span>线程<span style="white-space:pre">,即唤醒</span>全部<span style="white-space:pre">处于睡眠的</span>线程<span style="white-space:pre">——>对象的</span>线程
public final native void notifyAll();
<span style="white-space:pre"> </span>//线程休眠等待
public final native void wait(long timeout) throws InterruptedException;
<span style="white-space:pre"> </span>//线程休眠等待
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
} if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
} if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
} wait(timeout);
}
<span style="white-space:pre"> </span>//线程休眠等待
public final void wait() throws InterruptedException {
wait(0);
}
<span style="white-space:pre"> </span>//GC回收(垃圾回收)收尾工作
protected void finalize() throws Throwable {
}
}
解释如上,会有下面一些问题:
1、为什么会用到native这个词?
这个还真不好回答,先来介绍java的一门技术——JNI(Java Native Interface),这个的出现非常大程度上是丰富了java语言的,它同意java语言调用其它语言的东东,有一些java不好实现的东东,就能够使用其它语言进行实现,然后供给java调用。上面出现这么多native方法,说得难听一点就是java实现不了的功能,在JVM层次使用了C\C++实现了,丰富了java应用层的api。
2、finalize()方法?
这个是要跟GC结合来说明,后面会重点介绍~
3、非常多方法声明为final?
声明为final的方法表示终结,不能被重写~即方法的作用功能不能进行改动
【小白的java成长系列】——顶级类Object源代码分析的更多相关文章
- 【小白的java成长系列】——面向对象基础
今天来说说java面向对象的知识点~事实上.java在其发展过程中可以成功.非常大一部分原因是其面向对象的思想~ 1.概念 如今来说面向对象思想.也不是什么新的知识点了,我们知道如今非常多语言都有面向 ...
- 【小白的java成长系列】——java ide 开发工具eclipse的操作
今天看了一下自己的博客文章,里面的内容还是比較杂的,有好多技术,有好多语言,都没有突出自己的强项,能够说,从博客里面,看不出我究竟是做哪块的..加上今天被授予了博客准专家勋章,自己想了一下,还是得梳理 ...
- 【小白的java成长系列】——javakeyword
准备出一个系列的内容啦,今天就从keyword開始说起吧~ 类型 keyword 说明 keyword 说明 訪问控制权限 public 公共的.公开的. protected 受保护的.用来修饰属性或 ...
- 【小白的java成长系列】——windows下搭建和配置java环境
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/enson16855/article/details/25967851 基于非常多原因,还是得说说ja ...
- java中普通的顶级类是不能使用static关键字修饰的。只有内部类可以使用static修饰,也可以不使用staitc关键字修饰。
java中普通的顶级类是不能使用static关键字修饰的.只有内部类可以使用static修饰,也可以不使用staitc关键字修饰. java中的类可以是static吗?答案是可以.在java中我们可以 ...
- Java中特殊的类——Object类
Java中特殊的类--Object类 1.Object类的概述 Object类是java默认提供的类.Java中除了Object类,所有的类都是有继承关系的.默认会继承Object类,即所有的对象都可 ...
- Java并发系列[5]----ReentrantLock源码分析
在Java5.0之前,协调对共享对象的访问可以使用的机制只有synchronized和volatile.我们知道synchronized关键字实现了内置锁,而volatile关键字保证了多线程的内存可 ...
- java集合系列之LinkedList源码分析
java集合系列之LinkedList源码分析 LinkedList数据结构简介 LinkedList底层是通过双端双向链表实现的,其基本数据结构如下,每一个节点类为Node对象,每个Node节点包含 ...
- java多线程系列(九)---ArrayBlockingQueue源码分析
java多线程系列(九)---ArrayBlockingQueue源码分析 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 j ...
随机推荐
- Swift - 类初始化和反初始化方法(init与deinit)
1,init():类的初始化方法(构造方法) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...
- 终于懂了:TControl.Perform是有返回值的,且看VCL框架如何利用消息的返回值(全部例子都在这里)——它的存在仅仅是为了方便复用消息的返回值
代码如下: function TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint; var Message: TMess ...
- 移植ffmpeg到VC环境心得
所有想学习ffmpeg的网友有福了,大名鼎鼎的ffmpeg,移植到Windows的VC6版本全部开源,编译环境为VC6+SP5+VCPP5.别忘记了顶贴哦. 移植ffmpeg到windows,主要的修 ...
- Free Mind » Blog Archive » Yakuake + dtach vs Screen + urxvt
Free Mind » Blog Archive » Yakuake + dtach vs Screen + urxvt Yakuake + dtach vs Screen + urxvt
- tasklet和workqueue的选择
linux内核设计与实现page127中有个比較,内容比較多.概括一下就是1. tasklet不能休眠, 2. 不须要休眠tasklet效率更高 3.有休眠仅仅能workqueue (1)假设不须要休 ...
- Android真机网络adb联机调试初探
新项目是一个基于android4.2设备.刚拿到demo板时就对联机互调感兴趣了.处于以前在S3c2440上对linux的移植使用经验.心里猜测对于android设备应该也这样.所以通过搜索资料整理如 ...
- drupal form 中图片上传
1.创建url 链接到form $items['qianfeng/add'] = array( 'title' => t('加入信息'), 'page callback' =&g ...
- PAT-B 1015. 德才论(同PAT 1062. Talent and Virtue)
1. 在排序的过程中,注意边界的处理(小于.小于等于) 2. 对于B-level,这题是比較麻烦一些了. 源代码: #include <cstdio> #include <vecto ...
- 使用SVN clang: error: linker command failed with exit code 1 (use -v to see invocation)
然后上传到该项目SVN仓库上,例如,下面的错误再次发生再拉到本地编译 ld: library not found for -lxxxxxxxxxxxx clang: error: linker com ...
- 初步C++运算符重载学习笔记<3> 增量递减运算符重载
初步C++运算符重载学习笔记<1> 初探C++运算符重载学习笔记<2> 重载为友元函数 增量.减量运算符++(--)分别有两种形式:前自增++i(自减--i).后自增i ...