1、getClass方法

源码:

功能:

返回此Object的运行时类。

什么是运行时类?

如上图所示,类从被加载到虚拟机内存开始,到卸载出内存为止,他的生命周期一共包含7个阶段。其中加载阶段虚拟机需要做3件事。

1)通过一个类的全限定性类名来获取定义此类的二进制流文件。

2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

3)在内存中生成一个代表这个类的java.lang.class对象,作为方法区这个类的各种数据的访问入口。(getClass就是获取这个对象,这是当前类的对象在运行时类的所有信息的集合)

2、hashCode方法

这是一个public的native方法,默认通过对象的内部地址(也就是物理地址)转换成一个整数,然后该整数通过hash函数的算法就得到了该对象的hashcode,子类可以对其进行重写,建议在重写对象的equals方法的时候同时重写对象hashcode方法,不然在使用集合类时有可能会出错。

3、equals方法

对于比较2个对象是否相同。默认情况下比较的是2个对象的内存地址是否相同,建议重写。

为什么需要重写equals方法?

①因为如果不重写equals方法,有可能我们认为相同的2个对象不会相同,如果有一个类Person有1个属性字符串类型的身份证号,一般情况下一个人只有一个身份证,所以只要身份证相同,就能代表是一个人,但是如果不重写equals方法,则达不到这种效果。

②当将自定义对象放到map或者set中时;如果这时两个对象的hashCode相同,就会调用equals方法进行比较,这个时候会调用Object中默认的equals方法,而默认的equals方法只是比较了两个对象的引用是否指向了同一个对象,显然大多数时候都不会指向,这样就会将重复对象存入map或者set中。这就破坏了map与set不能存储重复对象的特性,会造成内存溢出。

4、clone方法

可以实现对象的浅复制,只有实现了Cloneable接口才能调用该方法,否则为抛出CloneNotSupportedException异常。

java中什么是浅复制(拷贝)什么是深复制(拷贝)。

浅拷贝是指拷贝一层,深层次对象级别就只拷贝引用;深拷贝是每一层的数据都会拷贝出来。简单来说就是浅拷贝的时候如果数据是基本数据类型,那么就如同直接赋值那样,会拷贝其本身;

如果除了基本数据之外还有一层的对象,那么对于浅拷贝来说,就只能拷贝其引用。如果原对象的值发生了变化,那么这个结果不光会反映到原对象上,但是深拷贝就不一样,即使有嵌套关系依然会全部的拷贝出来。

5、toString()方法

返回当前对象的字符串表示,通常情况下都会对这个方法重写,如果不重写,则默认为当前类的全限定性类名+@+该对象的hashcode的16位表示。

6、wait方法及其重载

以下三个方法是用来线程间通信用的,作用是阻塞当前线程,等待其他线程调用notify()/notifyAll()方法将其唤醒。这些方法都是public final的,不可被重写。

  1. 注意:
  2.  
  3. 此方法只能在当前线程获取到对象的锁监视器之后才能调用,否则会抛出IllegalMonitorStateException异常。
  4. 调用wait方法,线程会将锁监视器进行释放;而Thread.sleepThread.yield()并不会释放锁。
  5. wait方法会一直阻塞,直到其他线程调用当前对象的notify()/notifyAll()方法将其唤醒;而wait(long)是等待给定超时时间内(单位毫秒),
    如果还没有调用notify()/nofiyAll()会自动唤醒;waite(long,int)如果第二个参数大于0并且小于999999,则第一个参数+1作为超时时间;

7、notify()和notifyAll()

当前线程获得了当前对象锁,调用wait方法,将锁释放并阻塞;这时另一个线程获取到了此对象锁,并调用此对象的notify()/notifyAll()方法将之前的线程唤醒。这些方法都是public final的,不可被重写。

8、finalize()

此方法是在垃圾回收之前,JVM会调用此方法来清理资源。此方法可能会将对象重新置为可达状态,导致JVM无法进行垃圾回收。 我们知道java相对于C++很大的优势是程序员不用手动管理内存,内存由jvm管理;如果我们的引用对象在堆中没有引用指向他们时,当内存不足时,JVM会自动将这些对象进行回收释放内存,这就是我们常说的垃圾回收。但垃圾回收没有讲述的这么简单。 finalize()方法具有如下4个特点: 永远不要主动调用某个对象的finalize()方法,该方法由垃圾回收机制自己调用; finalize()何时被调用,是否被调用具有不确定性; 当JVM执行可恢复对象的finalize()可能会将此对象重新变为可达状态; 当JVM执行finalize()方法时出现异常,垃圾回收机制不会报告异常,程序继续执行。

 

Object类中的常用方法的更多相关文章

  1. 重写Object类中的equals方法

    Object是所有类的父亲,这个类有很多方法,我们都可以直接调用,但有些方法并不适合,例如下面的student类 public class Student { //姓名.学号.年纪 private S ...

  2. 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解(转载)

    java中的hashcode.equals和toString方法都是基类Object的方法. 首先说说toString方法,简单的总结了下API说明就是:返回该对象的字符串表示,信息应该是简明但易于读 ...

  3. Object类中getClass()

    Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类.类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型.所有的类型类 ...

  4. Object类中方法详解

    目录 概述 hashCode方法 getClass方法 toString方法 equals方法 clone方法 finalize方法 概述 Object 是类层次结构的根类.每个类都使用 Object ...

  5. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  6. Object类中通用方法之:toString()方法

    1.Java所有的对象都是Object类的实例,都可以直接调用该类中定义的方法,这些方法称为通用方法 2.toString()方法即为Object类中定义的通用方法之一 3.平时我们如果在控制台直接打 ...

  7. wait(),notify(),notifyAll()用来操作线程为什么定义在Object类中?

    这些方法存在于同步中: 使用这些方法必须标识同步所属的锁: 锁可以是任意对象,所以任意对象调用方法一定定义在Object类中. Condition是在java 1.5中才出现的,它用来替代传统的Obj ...

  8. Object类中常见的方法,为什么wait notify会放在Object里边

    toString():输出一个对象的地址字符串(哈希code码):可以通过重写toString方法,获取对象的属性! equals():比较的是对象的引用是否指向同一块内存地址, 重写equals() ...

  9. Object类中的五种方法

    clone() Object类源码:protected native Object clone() throws CloneNotSupportedException; 这里有个问题:为什么Sun公司 ...

随机推荐

  1. Eclipce怎么恢复误删类

    选择误删除文件在eclipse所在包(文件夹) 在包上单击右键. 选择restore from local history... 在弹出的对话框中选择需要恢复的文件

  2. μC/OS-III---I笔记8---事件标志

    当任务需要同步时可以使用信号量.A任务给B任务发送消息后B任务才能继续运行.如果需要A任务给任务B传递数据的时候就可以采用消息队列.但对于繁杂任务的同步,比如多个时间发生以后执行一个事件,或者是C任务 ...

  3. js sort tricks All In One

    js sort tricks All In One js 排序技巧 const arr = [ { label: 'False 1 ', disabled: false, }, { label: 'F ...

  4. MBP 屏幕分辨率 All In One

    MBP 屏幕分辨率 All In One screen size bug https://stackoverflow.com/questions/65462643/how-to-get-the-rea ...

  5. SCSS 复用 class 样式

    SCSS 复用 class 样式 @mixin & @include 复用的变量名称,不可以是 .class 开头️ css-varibale-name .css-class-name Mix ...

  6. CDN 工作原理剖析

    CDN 工作原理剖析 CDN / Content Delivery Network / 内容分发网络 https://www.cloudflare.com/zh-cn/learning/cdn/wha ...

  7. random array & shuffle 洗牌算法 / 随机算法

    random array & shuffle shuffle 洗牌算法 / 随机算法 https://en.wikipedia.org/wiki/Fisher–Yates_shuffle ES ...

  8. bili & library bundler

    bili & library bundler https://bili.egoist.sh/#/#quick-start # Node.js 8 or above: $ npm i -D bi ...

  9. Azure 计费 & 成本管理 & 取消 Azure 订阅

    Azure 计费 & 成本管理 & 取消 Azure 订阅 https://docs.microsoft.com/zh-cn/azure/cost-management-billing ...

  10. Rollup & Webpack & Parcel

    Rollup & Webpack & Parcel package bundler https://x-team.com/blog/rollup-webpack-parcel-comp ...