java.lang.Object底层代码分析-jdk1.8

首先先来说明两件事情

1、后面的一些博客都会对jdk底层的方法进行一些分析,因为我个人开发了2年多,发现有很多事情还不是清楚,当我今天再好好底层源码的时候还是有不少的收获,所以和大家分     享一下,我只要参考一下相关文档

jdk1.8api:https://docs.oracle.com/javase/8/docs/api/index.html

代码下载地址:https://gitee.com/luanmihun/java-jdk-study

2、为什么要分析jdk1.8的版本,只是一些个人的分析,还望理解,如果说的不对麻烦您再评论中给我提出修改意见我会及时修改?

主要的原因在我看来,现在很多公司都在采用springboot进行开发,因为他的自动装配还是很好用的,springboot1.x的版本支持jdk1.7和1.8,而到了springboot2.x版本已经支持    到 了jdk1.9(目前最新版本是10版本,java SE 9已达到支持结束。Java SE 9的用户应该切换到Java SE 10这是官方给出的说明),springboot2.x版本也是支持jdk1.8的所以这里   面我们选择jdk1.8的底层进行说明,其实不管理解了那个版本的底层,最后你只要查看每次更新的新特性还是能很快就跟上脚步的。

现在开始代码的分析

我已在代码里面写了相关注释,所以大家之后的相关分析直接看注释就可以了,源码可以直接在git上面进行下载

我们分析的底层源码全部是在rt.jar里面。

下面的内容就是java.lang.Object类里面的所有方法

package java.lang;

/**
 * @Auther: luanmihun
 * @Date: 2018/7/30 17:02
 * @Description:java.lang包下面的Object里面的方法分析,对里面的方法测试类在main.test.lang.ObjectMethodTest.java
 * Object为所有类的父类,是在jdk1.0中就定义好的
 * 目前没有说明的问题clone()方法的深入理解和toHexString()方法说明,线程方面的说明
 */
public class ObjectMethodExplain {

    /**
     * native是关键字。它一般在本地声明,异地用C和C++来实现。它的声明有几点要注意:
     * 1)native与访问控制符前后的关系不受限制。
     * 2)必须在返回类型之前。
     * 3)它一般为非抽象类方法。
     * 4)native方法在异地实现,象抽象方法一样,所以没有方法体,以分号结束
     *
     * 说明:.剩下的.dll文件里面的内容会做一些深度的研究,后续会进行更新
     */

    //在Object加载的时候会加载registerNatives()方法,并调用.dll文件
    private static native void registerNatives();
    static {
        registerNatives();
    }

    /**
     * 返回运行时候的类因为被final修饰所以不能重写,在main函数中进行了测试,其中返现两个错误
     * 1) java.lang.SecurityException: Prohibited package name: java.lang项目中不能以java.什么对包名进行调用
     * 2) java.lang.UnsatisfiedLinkError: ObjectMethod.registerNatives()V是因为在调用的时候应当现加载registerNatives()方法
     *    而在以上面代码中我们写了一个registerNatives()方法,所以无法运行,需要注释掉registerNatives()方法
     */
    //public final native Class<?> getClass();

    /**
     * 返回对象的哈希代码值,支持哈希表,例如:java.util.HashMap
     * hashCode返回的并不一定是对象的(虚拟)内存地址,具体取决于运行时库和JVM的具体实现。
     * 特性如下:
     * 1) 一致性(consistent),在程序的一次执行过程中,对同一个对象必须一致地返回同一个整数。
     * 2) 如果两个对象通过equals(Object)比较,结果相等,那么对这两个对象分别调用hashCode方法应该产生相同的整数结果,
     *     这里equals和hashCode说的都是Object类的
     * 3) 如果两个对象通过java.lang.Object.equals(java.lang.Ojbect)比较,结果不相等,不必保证对这两个对象分别调用hashCode也返回两个不相同的整数
     */
    public native int hashCode();

    /**
     * 比较两个对象hashCode值是否相同
     * @param obj  传入的对象
     * @return boolean类型
     */
    public boolean equals(Object obj) {
        return (this == obj);
    }

    /**
     * 创建并返回此对象的副本,这个方法的调用类需要实现Cloneable接口,这里面涉及到深浅copy,会在后面进行说明,如果没有实现Cloneable类就不抛出CloneNotSupportedException异常
     * @return
     * @throws CloneNotSupportedException
     */
    protected native Object clone() throws CloneNotSupportedException;

    /**
     * 返回一个对象名以及所在的包名[email protected]+hashCode值,后面会对toHexString()方法进行说明
     * @return
     */
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

    /**
     * 唤醒在这个对象的监视器上等待的单个线程
     */
    //public final native void notify();

    /**
     * 唤醒在这个对象的监视器上等待的所有线程
     */
    //public final native void notifyAll();

    /**
     * 使当前线程处于等待的状态知道被notify(),方法和notifyAll()方法所调用
     * @param timeout  最大等待时间
     */
    //public final native void wait(long timeout) throws InterruptedException;

    /**
     * 当前线程处于等待的状态知道被notify(),方法和notifyAll()方法所调用
     * @param nanos  额外的时间,在纳秒范围0- 999999
     * @param timeout 最大等待时间
     *
     */
//    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 > 0) {
//            timeout++;
//        }
//
//        wait(timeout);
//    }

    /**
     * 当前线程处于等待的状态知道被notify(),方法和notifyAll()方法所调用,默认时间为0
     */
//    public final void wait() throws InterruptedException {
//        wait(0);
//    }

    /**
     * 垃圾回收机制所要用的方法
     * @throws Throwable
     */
    protected void finalize() throws Throwable { }

}

下面是测试类

package test.main.lang;

/**
 * @Auther: luanmihun
 * @Date: 2018/7/30 17:02
 * @Description:java.lang中Object的方法进行测试,具体方法说明请参考java.lang.ObjectMethod
 */
public class ObjectMethodTest implements Cloneable{

    public static void main(String[] args) throws Exception {

        ObjectMethodTest obj = new ObjectMethodTest();

        //getClass()方法测试
        System.out.println("getClass()方法测试结果:"+ obj.getClass());

        //hashCode()方法测试
        System.out.println("hashCode()方法测试结果:"+obj.hashCode());

        //equals()方法测试
        ObjectMethodTest obj1 = new ObjectMethodTest();
        System.out.println("obj的hashCode值为:"+obj.hashCode());
        System.out.println("obj1的hashCode值为:"+obj1.hashCode());
        System.out.println("equals()方法测试结果:"+obj.equals(obj));
        System.out.println("equals()方法测试结果:"+obj1.equals(obj));

        //clone()方法测试
        System.out.println("clone()方法测试结果:"+obj.clone());

        //toString()方法测试
        System.out.println("toString()方法测试结果:"+obj.clone());

    }
}

原文地址:https://www.cnblogs.com/mihun-666/p/9393440.html

时间: 2024-07-28 19:22:43

java.lang.Object底层代码分析-jdk1.8的相关文章

Java.lang.Object.clone()分析

首先,看一下源码: 1 public class Object { 2 protected native Object clone() throws CloneNotSupportedException; 3 } 由源代码我们会发现: 第一:Object类的clone()方法是一个native方法,native方法的效率一般来说都是远高于Java中的非native方法.这也解释了为什么要用Object中clone()方法而不是先new一个类,然后把原始对象中的信息复制到新对象中,虽然这也实现了c

Attempt to invoke virtual method &#39;boolean java.lang.String.equals(java.lang.Object)&#39; on a null object reference xxx 的问题分析与解决方案

最近,公司要求开发一个APP,所以很苦逼的学习了几天 Android 的上手手册,但是实际运用于开发中还是捉襟见肘,困难重重:好在的是,部门还有几个专门搞安卓的大佬可以问问,哈哈 好了,进入今天的正题吧,前天开发过程中,遇到一个如“标题”所示的问题,百思不得其解!最终上网搜报错的原因,才找到问题的所在:.xml文件中运用到了不存在的标签--我的是因为粗心把<View>写成了<view>,加载的时候找不到该标签,所以页面一直运行不出来. 所以,该问题基本出在于布局页面有错(有的错误页

Java总结篇系列:java.lang.Object

从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java中最基本的类java.lang.Object开始谈起. Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起.作为其他所有类的基类,Object具有哪些属性和行为, 是Java语言设计背后的思维体现. Object类位于java.lang包中,java.lang包包

type parameters of &lt;T&gt;T cannot be determined; no unique maximal instance exists for type variable T with upper bounds int,java.lang.Object

今天在进行代码检查的时候出现下面的异常: 1 type parameters of <T>T cannot be determined; no unique maximal instance exists for type variable T with upper bounds int,java.lang.Object 当时的第一感觉就是代码因为jdk版本太低引起的. 因为最后咨询了配置管理组的同事,确实发现是因为我本地jdk用的是1.7版本,而代码检查机器上用的是jdk1.6版本.因此出现

java.lang.Object.hashCode()的返回值到底是不是对象内存地址?

刚学Java的时候我也有过这种怀疑,但一直没有验证:最近在OSCHINA上看到有人在回答问题时也这么说,于是萌生了一探究竟的想法--java.lang.Object.hashCode()的返回值到底是不是对象内存地址? (顺带回顾一下JNI) hashCode契约 说到这个问题,大家的第一反应一定和我一样--去查Object.hashCode的源码,但翻开源码,看到的却是这样的(Oracle JDK 8): /** * Returns a hash code value for the obje

java.lang.Object 之 clone() 使用

Java的所有类都默认继承 java.lang.Object 类,在 java.lang.Object 类中有一个方法 clone().JDK API的说明文档解释这个方法将返回Object对象的一个拷贝.要说明的有两点:一是拷贝对象返回的是一个新对象,而不是一个引用.二是拷贝对象与用 new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息.对于Java中使用 clone() 方法有几点需要注意 1:被clone的类必须实现 Cloneable 接口,Clo

java.lang.Object

java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. Object类是Java中唯一没有父类的类. 其他所有的类,包括标准容器类,比如数组,都继承了Object类中的方法. Object类中的方法 构造方法:public Object() 文档中的类概览: Java中的每个类都具有定义在Object类中的这些方法. protected Object clone() Creates and returns

深入研究java.lang.Object类

一.概述:       Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法.在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类.      可以使用类型为Object的变量指向任意类型的对象.      Object类有一个默认构造方法pubilc Object(),在构造子类实例时,都会先调用这个默认构造方法.      Object类的变量只能用作各种值的通用持有者.要对他们进行任何专门的操作,都需要知道它

解决 java/lang/NoClassDefFoundError: java/lang/Object 错误

安装完JDK ,设定环境变量后出现这个错误: [[email protected] lib]# javacError occurred during initialization of VMjava/lang/NoClassDefFoundError: java/lang/Object [[email protected] lib]# javaError occurred during initialization of VMjava/lang/NoClassDefFoundError: jav