返回顶部
首页 > 资讯 > 精选 >Java基础之如何理解Object源码
  • 198
分享到

Java基础之如何理解Object源码

2023-06-15 22:06:58 198人浏览 薄情痞子
摘要

本篇内容主要讲解“Java基础之如何理解Object源码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java基础之如何理解Object源码”吧!getClasspublic fina

本篇内容主要讲解“Java基础之如何理解Object源码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java基础之如何理解Object源码”吧!

getClass

public final native Class getClass();

getClass 也是个 native 方法,这个方法的作用就是返回某个对象的运行时类,它的返回值是 Class 类型,Class c =  obj.getClass();通过对象 c ,我们可以获取该对象的所有成员方法,每个成员方法都是一个 Method  对象;我们也可以获取该对象的所有成员变量,每个成员变量都是一个 Field 对象;同样的,我们也可以获取该对象的构造函数,构造函数则是一个  Constructor 对象。这个方法在反射时会常用到。

hashCode

public native int hashCode();
  • hashCode 方法返回散列值。

  • 返回值默认是由对象的地址转换而来的。

  • 同一个对象调用 hashCode 的返回值是相等的。

  • 两个对象的 equals 相等,那 hashCode 一定相等。

  • 两个对象的 equals 不相等,那 hashCode 也不一定相等。

equals

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

equals 的实现非常简单,它的作用就是比较两个对象是否相等,而比较的依据就是二者的内存地址。除此之外,equals 还遵循以下几个原则:

1、自反性:x.equals(x);  // true 2、对称性:x.equals(y) == y.equals(x);  // true 3、传递性:if (x.equals(y) && y.equals(z))             x.equals(z); // true; 4、一致性,只要对象没有被修改,多次调用 equals() 方法结果不变: x.equals(y) == x.equals(y); // true  5、非空性,对任何不是 null 的对象 x 调用 x.equals(null) 结果都为 false : x.equals(null); // false;

为什么要重写 hashcode 和 equals ?

因为这两个方法都跟对象的比较有关,所以如果在程序中要做对象比较,那大概率要重写这两个方法了。因为equals默认的比较逻辑就是对象的地址进行比较,两个对象内存地址肯定不同,所以无论如何两个对象通过eqals比较肯定返回false。

但在实际编程中,我们经常会遇到去重,或者将对象放到有序集合中,或者将对象存入无重复的集合中,这时如果没有重写equals和hashCode,则无法达到需求。

举个例子,系统中同时存在两个对象,对象A和对象B,其姓名和身份证号一模一样。此时,在系统内存中是两个对象,但其内容一致分明是一个人同时产生了两条重复信息。如果使用默认的equals方法比较,则这两个对象永远不相等,永远不能比出来是一条相同的重复信息。所以,要重写equals和hashCode方法来达到以上需求效果。

clone

protected native Object clone() throws CloneNotSupportedException;

clone() 是 Object 的 protected 方法,它不是 public,一个类不显式去重写 clone(),其它类就不能直接去调用该类实例的  clone() 方法。此外,Clone 的注释中还提到比较重要的几点:

  • 克隆的对象必须要实现 Cloneable 接口并重写 clone 方法,否则会报 CloneNotSupportedException 异常

  • clone() 方法并不是 Cloneable 接口的方法,而是 Object 的一个 protected 方法。Cloneable  接口只是规定,如果一个类没有实现 Cloneable 接口又调用了 clone() 方法,就会抛出  CloneNotSupportedException。

  • 浅拷贝:拷贝对象和原始对象的引用类型引用同一个对象。

  • 深拷贝:拷贝对象和原始对象的引用类型引用不同对象。

关于浅拷贝与深拷贝我们后面再讨论。

toString

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

返回该对象的字符串表示,非常重要的方法

  • getClass().getName(); 获取字节码文件的对应全路径名例如java.lang.Object;

  • Integer.toHexString(hashCode()); 将哈希值转成16进制数格式的字符串。

wait 和 notify

public final void wait() throws InterruptedException {      wait(0); }  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); }

wait 的作用是让当前线程进入等待状态,同时,wait() 也会让当前线程释放它所持有的。直到其他线程调用此对象的 notify() 方法或  notifyAll() 方法,当前线程被唤醒进入就绪状态。

wait(long timeout) (以毫秒为单位)让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的notify() 方法或  notifyAll() 方法,或者超过指定的时间量,当前线程被唤醒进入就绪状态。

wait(long timeout, int nanos) 和 wait(long timeout)  功能一样,唯一的区别是这个可以提供更高的精度。总超时时间(以纳秒为单位)计算为 1000000 *timeout+ nanos。By the way  ,wait(0,0) 和 wait(0) 效果一样。

ublic final native void notify(); public final native void notifyAll();

首先是 notify ,notify 的作用就是随机唤醒在等待队列的某个线程,而 notifyAll 就是唤醒在等待队列的所有线程。

注意:notify 和 wait 方法的使用规范。意思就是这二者必须在 synchronized 修饰的同步方法或同步代码中使用。

Thread.sleep() 和 Object.wait() 有什么区别?

首先,二者都可以暂停当前线程,释放 CPU 控制权。主要的区别在于 Object.wait()在释放 CPU 同时,释放了对象锁的控制。而  Thread.sleep() 没有对锁释放。换句话说 sleep 就是耍流氓,占着茅坑不拉屎。

完整代码

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

到此,相信大家对“Java基础之如何理解Object源码”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Java基础之如何理解Object源码

本文链接: https://lsjlt.com/news/281725.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java基础之如何理解Object源码
    本篇内容主要讲解“Java基础之如何理解Object源码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java基础之如何理解Object源码”吧!getClasspublic fina...
    99+
    2023-06-15
  • Java基础之Object类详解
    object类的介绍 object是所有类的直接父类或者是间接父类,为什么这么说呢? 可以查询java8的API帮助文档: 可见在这样的一个类树中,所有的类的根还是Object类 ...
    99+
    2024-04-02
  • java基础之如何封装处理
    这篇文章主要介绍了java基础之如何封装处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、private实现封装处理如果像想要知道封装,首先必须清楚如果没有封装会怎么样?...
    99+
    2023-06-20
  • java框架基础之SPI机制实现及源码解析
    目录1 定义2 案例实现标准接口厂商的具体接口实现3 SPI机制源码分析3.1 load加载过程3.2 实例化过程1 定义 SPI 的全名为 Service Pr...
    99+
    2024-04-02
  • 了解java中对象基础Object类
    目录一、Object简述1、显式扩展2、引用与对象二、基础方法1、getClass2、toString3、equals与hashCode4、thread相关5、clone6、fina...
    99+
    2024-04-02
  • 深入理解JAVA基础类库中对象Object类
    引言 Object类是所有类、数组的父类,位于java.lang 包下也就是说,Java允许把所有任何类型的对象赋给Object类型的变量。当定义一个类时没有使用extends关键字...
    99+
    2024-04-02
  • java基础之注解
    1、元注解1 @Target【作用】用于指定所标注的注解可以使用的位置,例如:@Target(ElementType.METHOD):表示可以使用在方法上,其他结构不能使用;@Target({ElementType.METHOD, Elem...
    99+
    2020-09-10
    java入门 java 注解
  • Java基础之异常处理详解
    目录Exception 类的层次Java 内置异常类异常方法捕获异常throws/throw 关键字finally关键字try-with-resources声明自定义异常通用异常异常...
    99+
    2023-05-17
    Java异常处理机制 Java异常处理 Java异常
  • Java基础之代码死循环详解
    目录一、前言二、死循环的危害三、哪些场景会产生死循环?3.1 一般循环遍历3.1.1 条件恒等3.1.2 不正确的continue3.1.3 flag线程间不可见3.2 Iterat...
    99+
    2024-04-02
  • Java基础之StringBuffer详解
    目录一、前言二、用法三、结果四、长度 容量五、IStringBuffer接口六、value和capacity一、前言 StringBuffer是可变长的字符串 1.append 追加...
    99+
    2024-04-02
  • Java基础之Maven详解
    目录一、Maven环境的搭建1. 为什么要学习Maven?2. Maven项目架构管理工具3. 下载安装Maven4. 配置环境变量5. 阿里云...
    99+
    2024-04-02
  • Java基础之TreeMap详解
    目录一、写在前面二、定义三、成员变量四、内部类五、构造器六、成员方法一、写在前面 TreeMap的底层数据结构是红黑树,且TreeMap可以实现集合元素的排序。 所以TreeMap...
    99+
    2024-04-02
  • Java基础之ClassLoader详解
    目录一、ClassLoader简介二、内置的CLassLoader的类型三、BootstrapClassLoader四、ExtClassLoader五、AppClassLoader六...
    99+
    2024-04-02
  • Java基础之FastJson详解
    目录一、fastJson将json格式字符串转化成List集合二、fastJson将json格式字符串转化成对象三、FastJson将对象或集合转化成json格式字符串四、FastJ...
    99+
    2024-04-02
  • Java基础入门篇之如何理解方法和重载
    本篇内容介绍了“Java基础入门篇之如何理解方法和重载”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是方法简单来说方法就是一段可以被...
    99+
    2023-06-15
  • Libtask源码解析之如何理解锁
    这篇文章主要讲解了“Libtask源码解析之如何理解锁”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Libtask源码解析之如何理解锁”吧!libtask中...
    99+
    2024-04-02
  • Java基础之动态代理Cglib详解
    目录一、前言二、服务三、代理工厂四、结果一、前言 经测试,jdk创建对象的速度远大于cglib,这是由于cglib创建对象时需要操作字节码。cglib执行速度略大于jdk,所以比较适...
    99+
    2024-04-02
  • Java+Linux内核源码之如何理解多线程之进程
    这篇文章主要讲解了“Java+Linux内核源码之如何理解多线程之进程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java+Linux内核源码之如何理解多线程之进程”吧!Linux 内核如...
    99+
    2023-06-15
  • Android入门之源码开发基础教程
    本文讲述了Android入门之源码开发基础教程。分享给大家供大家参考,具体如下: 下载 Android 源码之后,接下来就是学习或者进行开发。 在开发之前,谈一些开发必备知识或...
    99+
    2022-06-06
    源码 教程 Android
  • Java基础之数组详解
    目录前言二.创建数组三.数组的使用四.数组的遍历五.数组作为方法的参数六.数组相关方法Arrays前言 我们了解数组这个概念之前,我们先思考下面几个问题。 如果我们需要两个数据,那么...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作