栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JDK1.8源码阅读笔记——Object根父类(一)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JDK1.8源码阅读笔记——Object根父类(一)

文章目录
  • 1.Object根父类代码结构
    • 方法一:void registerNatives()
    • 方法二:Class getClass()
    • 方法三:int hashCode()
    • 方法四:boolean equals(Object obj)
  • 2.全部源码注释解析
  • 3.遇到的小问题
    • 问题1:native关键字
    • 问题2:jls(java language specification java语言规范
    • 问题3:see注解
    • 问题4:param注解

1.Object根父类代码结构

方法一:void registerNatives()


1、 registerNatives函数前面有native关键字修饰,Java中,用native关键字修饰的函数表明该方法的实现并不是在Java中去完成, 而是由C/C++去完成,并被编译成了.dll,由Java去调用。方法的具体实现体在dll文件中,对于不同平台,其具体实现应该有所不同。
2、 用native修饰,即表示操作系统需要提供此方法,Java本身需要使用。具体到registerNatives()方法本身, 其主要作用是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。
**3、**从方法的代码中看到Object类定义了一个静态初始化块,我们知道当创建Java对象时,系统总是先调用静态初始化块
4、 在静态初始化块中调用了registerNatives()方法,并且使用了private来修饰,表面这个方法是私有的并不被外部调用。
*/

方法二:Class getClass()

1、作用:返回Object对象的运行时对象的类
2、返回值为对象的类
例如:

package cn.Ivan.test;

import java.util.ArrayList;


public class ObjectTest {
    public static void main(String[] args) {
            Object obj1 = new Object();
            System.out.println("obj1 的类: " + obj1.getClass());
            String obj2 = new String();
            System.out.println("obj2 的类: " + obj2.getClass());
            ArrayList obj3 = new ArrayList<>();
            System.out.println("obj3 的类: " + obj3.getClass());
        }
}

运行结果为:

结果分析:obj1,obj2,obj3分别属于Object、String、ArrayList类的对象,所以getClass会返回各自的运行时对象的类名

方法三:int hashCode()


1、作用:返回对象的哈希码值
2、返回值:对象的哈希值,int类型
例如:

package cn.Ivan.test;


public class ObjectTest {
   public static void main(String[] args) {
       
       Integer a = new Integer(10);
       
       System.out.println("The hashCode of Integer class object a is :" + a .hashCode());
       
       String str = new String("Hello, Welcome in java world");
       
       System.out.println("The hashCode of String class object str is :" + str.hashCode());
   }
}

运行结果:

方法四:boolean equals(Object obj)
public boolean equals(Object obj) {
        return (this == obj);
    }

1、作用:判断某个对象是否“等于”这个对象
2、返回值:布尔值true or false
3、性质:

a.自反性,对于非空引用值x,注意是非空,后面会说到null的情况
		x.equals(x)会返回true
		即:自身总是与自身“等于”。注意理解等于的实际意义,区别于现实中的等于
b.对称性:
	x.equals(y)为true,那么y.equals(x)也是true
c.可传递的
	x.equals(y)为true
	y.equals(z)为true
	那么x.equals(z)也为true
d.前后一致性:指的是在equals比较方法中使用的信息未被修改时,始终会返回相同的true or false结果
e.对于任何非空数值x,x.equals(null)应返回false
f.非空数值x和y在引用同一个对象时,equals方法返回true
g.当equals方法被覆写时,hashCode方法也会被覆盖,为了保证相等的对象具有相同的哈希值

例如:

 public static void main(String[] args) {
      // get an integer, which is an object
      Integer x = new Integer(50);
      // get a float, which is an object as well
      Float y = new Float(50f);
      // check if these are equal,which is
      // false since they are different class
      System.out.println("" + x.equals(y));
      // check if x is equal with another int 50
      System.out.println("" + x.equals(50));
  }

运行结果:

2.全部源码注释解析
package java.lang;

public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }
    

    
    public final native Class getClass();

    
    public native int hashCode();

    
    public boolean equals(Object obj) {
        return (this == obj);
    }

    
    protected native Object clone() throws CloneNotSupportedException;

    
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

    
    public final native void notify();//notify是“通知”的意思

    
    public final native void notifyAll();

    
    public final native void wait(long timeout) throws InterruptedException;

    
    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);
    }

    
    public final void wait() throws InterruptedException {
        wait(0);
    }

    
    protected void finalize() throws Throwable { }
}


3.遇到的小问题 问题1:native关键字
private static native void registerNatives();
    static {
        registerNatives();
    }

native即JNI,Java Native Interface(Java本地接口,用户和本地C代码进行互操作的API),也就是说一个native method就是一个java调用非java代码的接口,该方法由非java语言实现,例如C语言。
1、native是用作 java和其他语言进行协作时使用的,也就是native后的函数的实现不是用java编写的
2、既然都不是java,那就不管其源码如何,只需知道此方法已经被实现即可
3、native的意思是告诉操作系统,这个函数我要用,你必须给我实现,所以native关键字的函数时OS实现的,java平台只能调用
4、java是跨平台的语言,跨平台付出的代价就是牺牲一些对底层的控制。而java要实现对底层的控制就需要其他语言的帮助,这里的native就是帮助java实现对底层的控制。

问题2:jls(java language specification java语言规范
 * @jls 15.8.2 Class Literals

className.class在jls中定义为Class Literal,15.8.2位规范版本号

问题3:see注解

注解@see可以在注释汇总实现链接跳转,可以指向包,类,方法,属性。
使用方法:@see package.class#member
1、指向的目标在当前类:#+
@see #field
@see #method(type,…)
@see #constructor(type,…)
2、指向的目标在当前包,类名+#+
@seeClass #field
@see Class#method(type,…)
@see Class#constructor(type,…)
@see Class
3、指向的目标在其他包中,需要全路径
@see package.Class#field
@see package.Class#method(Type, Type,…)
@see package.Class#method(Type argname, Type argname,…)
@see package.Class#constructor(Type, Type,…)
@see package.Class#constructor(Type argname, Type argname,…)
@see package.Class.NestedClass
@see package.Class
@see package

问题4:param注解

@param是MyBatis提供的,作为Dao层的注解,用于传递参数,从而与SQL中的字段名相对应
作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中(一般通过#{}的方式,${}会有sql注入的问题)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/293995.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号