zoukankan      html  css  js  c++  java
  • 【小白的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层次使用了CC++实现了,丰富了java应用层的api。

    2、finalize()方法?

    这个是要跟GC结合来说明,后面会重点介绍~

    3、非常多方法声明为final?

    声明为final的方法表示终结,不能被重写~即方法的作用功能不能进行改动


  • 相关阅读:
    LiveNVS实现摄像头RTSP无插件播放,并集中化管理
    liveplayer免费网页直播_点播播放器-页面动态多播放器添加代码示例
    JavaScript之图片滚动
    JavaScript之图片轮换
    DOS命令
    jquery之音乐均衡器
    JavaScript之可运行按钮
    jQuery之点击弹出图标环形菜单
    Android之View方法
    Android之所有权限
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4381411.html
Copyright © 2011-2022 走看看