【小白的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这个类:

先奉上去掉注释的源码:可以看到这里面出现了很多native关键字,这个前面也有介绍,它是调用本地的方法,这边说得直白一点,就是调用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,这个就说明了为什么我们在打印对象的时候,控制台会看到[email protected]的信息,其实是调用的是这个方法
	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源码分析

时间: 2024-07-28 18:11:44

【小白的java成长系列】——顶级类Object源码分析的相关文章

Java入门系列之集合HashMap源码分析(十四)

前言 我们知道在Java 8中对于HashMap引入了红黑树从而提高操作性能,由于在上一节我们已经通过图解方式分析了红黑树原理,所以在接下来我们将更多精力投入到解析原理而不是算法本身,HashMap在Java中是使用比较频繁的键值对数据类型,所以我们非常有必要详细去分析背后的具体实现原理,无论是C#还是Java原理解析,从不打算一行行代码解释,我认为最重要的是设计思路,重要的地方可能会多啰嗦两句. HashMap原理分析 我们由浅入深,循序渐进,首先了解下在HashMap中定义的几个属性,稍后会

Java入门系列之集合Hashtable源码分析(十一)

前言 上一节我们实现了散列算法并对冲突解决我们使用了开放地址法和链地址法两种方式,本节我们来详细分析源码,看看源码中对于冲突是使用的哪一种方式以及对比我们所实现的,有哪些可以进行改造的地方. Hashtable源码分析 我们通过在控制台中实例化Hashtable并添加键值对实例代码来分析背后究竟做了哪些操作,如下: public static void main(String[] args) { Hashtable hashtable = new Hashtable(); hashtable.p

【小白的java成长系列】——String类的深入分析(基于源码)

接着前面面向对象来说吧~今天来说说String类..其实String类也包含很多面向对象的知识的~ 首先来问一个问题:我们在开发过程中,如果要使用一个类的话,就要创建对象,这句话没什么问题吧~在实际开发的时候确实是这样的,只有创建了对象才能真正的去使用一个普通的类,我们一般创建对象,几乎所有的类创建对象都是要通过new关键字来创建的~ 问题就来了..为什么我们的String可以直接写成String str = "abc";这样子呢? 当然String类也可以通过new来创建对象的...

【小白的java成长系列】——this关键字

先来看一下下面这段代码: package me.javen.oop; public class ThisDemo { public static void main(String[] args) { Dog dog = new Dog("小花", 10);//创建对象 System.out.println(dog); } } class Dog{ private String name; private int age; public Dog(){}//无参构造 public Dog(

【小白的java成长系列】——Java基础知识

今天来说说java的基础知识,个人感觉都不知道要说啥的,还是为后面的内容做一些铺垫吧~ 今天主要说的都是java面向对象之前的基础知识,比如数据类型呀,表达式运算符呀~等等一系列的知识,下节来说说面向对象.今天这节我就不用程序来说明,直接用文字说明.因为个人感觉真木有啥好说的,这些程序后续都会说到的,比较简单,写写就会了的..好吧~开始了... 1. Java数据类型划分: 基本数据类型:都是一个个具体的值 数值型:表示具体的数字,所有的整数默认情况下都是int,所有的小数都是double型的

【小白的java成长系列】——多线程初识(多人买票问题)

本来这节内容是要到后面来说的,因为最近在弄并发的问题,推荐一本书<java并发编程实战>,深入的讲解了多线程问题的.本人最近也刚好在看这本书,还不错的~ 多线程的相关概念,就不用说了的,自己可以去网上查找,有一大堆关于它的讲解~ 先来看看买票的程序: package me.javen.thread.one; public class TicketDemo { public static void main(String[] args) { // 使用Thread类的方式 // TicketTh

【小白的java成长系列】——构造方法私有化(单例设计)

有了解过spring框架的童鞋们就知道,spring的bean默认是什么形式呀?---单例形式的. 问:那什么叫做单例?单例其实就是Singleton,顾名思义就是只有单个的实例对象操作. 那为什么要使用单例呢? 至于这个问题,后面再做解释,我们先看代码: package me.javen.oop; public class SingletonDemo { public static void main(String[] args) { Singleton singleton1 = Single

【小白的java成长系列】——java关键字

准备出一个系列的内容啦,今天就从关键字开始说起吧~ 类型 关键字 说明 关键字 说明 访问控制权限 public 公共的,公开的, protected 受保护的,用来修饰属性或方法.只能符合有包内友好关系,或者是父子友好的类才能够访问,即:同层次包底下的可以访问:不能修饰类. private 私有的,用来修饰属性或方法,只能类的内部本身才能够访问,不能修饰类.   其实修饰符还有一种友好的类型 类.方法和变量修饰符 abstract 抽象;可以用来修饰类和方法,被修饰的类不能够实例化(即不能用n

关于java中ReentrantLock类的源码分析以及总结与例子

一,官方描述 关于ReentrantLock的官方描述,英文的就不贴出来了,这里我只贴出我自己翻译的描述: reentrant是一个跟synchronized具有相同行为和语义的持有锁来访问方法和语句的互斥锁,但是reentrant还拥有被扩展的能力. ReentrantLock会被线程拥有并且持续锁定,不会解锁.线程调用lock()方法返回后,则成功持有锁,否则这个锁正在被另一个线程所持有,只能等待另一个线程释放锁,如果当前线程拥有了锁,则调用lock()方法会立即返回,这个状态可以通过isH