基本描述:

  (1)Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入;

  (2)Object类是所有Java类的祖先。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。可以使用类型为Object的变量指向任意类型的对象

Object的主要方法介绍:

1

2

3

4

5

6

7

8

9

10

11

12

13

package java.lang;    

public class Object {    

      

   /* 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用。*/

    private static native void registerNatives();    

  /* 对象初始化时自动调用此方法*/

    static {    

        registerNatives();    

    }    

   /* 返回此 Object 的运行时类。*/

    public final native Class<?> getClass();

    public native int hashCode();

hashCode()方法:

hash值:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。

情景:考虑一种情况,当向集合中插入对象时,如何判别在集合中是否已经存在该对象了?(注意:集合中不允许重复的元素存在)。

大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,如果采用equals方法去逐一比较,效率必然是一个问题。此时hashCode方法的作用就体现出来了,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值。实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。

重写hashCode()方法的基本规则:

· 在程序运行过程中,同一个对象多次调用hashCode()方法应该返回相同的值。

· 当两个对象通过equals()方法比较返回true时,则两个对象的hashCode()方法返回相等的值。

· 对象用作equals()方法比较标准的Field,都应该用来计算hashCode值。

Object本地实现的hashCode()方法计算的值是底层代码的实现,采用多种计算参数,返回的并不一定是对象的(虚拟)内存地址,具体取决于运行时库和JVM的具体实现。

1

2

3

public boolean equals(Object obj) {

       return (this == obj);

} 

equals()方法:比较两个对象是否相等

我们知道所有的对象都拥有标识(内存地址)和状态(数据),同时“==”比较两个对象的的内存地址,所以说使用Object的equals()方法是比较两个对象的内存地址是否相等,即若object1.equals(object2)为true,则表示equals1和equals2实际上是引用同一个对象。虽然有时候Object的equals()方法可以满足我们一些基本的要求,但是我们必须要清楚我们很大部分时间都是进行两个对象的比较,这个时候Object的equals()方法就不可以了,实际上JDK中,String、Math等封装类都对equals()方法进行了重写。

1

protected native Object clone() throws CloneNotSupportedException;

clone()方法:快速创建一个已有对象的副本

第一:Object类的clone()方法是一个native方法,native方法的效率一般来说都是远高于Java中的非native方法。这也解释了为什么要用Object中clone()方法而不是先new一个类,然后把原始对象中的信息复制到新对象中,虽然这也实现了clone功能。

第二:Object类中的 clone()方法被protected修饰符修饰。这也意味着如果要应用 clone()方 法,必须继承Object类。

第三:Object.clone()方法返回一个Object对象。我们必须进行强制类型转换才能得到我们需要的类型。

克隆的步骤:1:创建一个对象;   2:将原有对象的数据导入到新创建的数据中。

clone方法首先会判对象是否实现了Cloneable接口,若无则抛出CloneNotSupportedException, 最后会调用internalClone. intervalClone是一个native方法,一般来说native方法的执行效率高于非native方法。

复制对象 or 复制引用

1

2

3

4

5

6

7

8

Person p = new Person(23"zhang"); 

Person p1 = p; 

  

System.out.println(p); 

System.out.println(p1); 

打印出来:

com.pansoft.zhangjg.testclone.Person@2f9ee1ac

com.pansoft.zhangjg.testclone.Person@2f9ee1ac

 

可已看出,打印的地址值是相同的,既然地址都是相同的,那么肯定是同一个对象。p和p1只是引用而已,他们都指向了一个相同的对象Person(23, "zhang") 。 可以把这种现象叫做引用的复制。

1

2

3

4

5

6

7

8

Person p = new Person(23"zhang"); 

Person p1 = (Person) p.clone(); 

  

System.out.println(p); 

System.out.println(p1); 

打印出:

com.pansoft.zhangjg.testclone.Person@2f9ee1ac

com.pansoft.zhangjg.testclone.Person@67f1fba0

  

从打印结果可以看出,两个对象的地址是不同的,也就是说创建了新的对象, 而不是把原对象的地址赋给了一个新的引用变量:

深拷贝 or 浅拷贝

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

public class Person implements Cloneable{ 

      

    private int age ; 

    private String name; 

      

    public Person(int age, String name) { 

        this.age = age; 

        this.name = name; 

    

      

    public Person() {} 

  

    public int getAge() { 

        return age; 

    

  

    public String getName() { 

        return name; 

    

      

    @Override

    protected Object clone() throws CloneNotSupportedException { 

        return (Person)super.clone(); 

    

}

Person中有两个成员变量,分别是name和age, name是String类型, age是int类型 

由于age是基本数据类型, 那么对它的拷贝没有什么疑议,直接将一个4字节的整数值拷贝过来就行。但是name是String类型的, 它只是一个引用, 指向一个真正的String对象,那么对它的拷贝有两种方式: 直接将源对象中的name的引用值拷贝给新对象的name字段, 或者是根据原Person对象中的name指向的字符串对象创建一个新的相同的字符串对象,将这个新字符串对象的引用赋给新拷贝的Person对象的name字段。这两种拷贝方式分别叫做浅拷贝和深拷贝。

通过下面代码进行验证。如果两个Person对象的name的地址值相同, 说明两个对象的name都指向同一个String对象, 也就是浅拷贝, 而如果两个对象的name的地址值不同, 那么就说明指向不同的String对象, 也就是在拷贝Person对象的时候, 同时拷贝了name引用的String对象, 也就是深拷贝。

1

2

3

4

5

6

7

8

9

Person p = new Person(23"zhang"); 

Person p1 = (Person) p.clone(); 

  

String result = p.getName() == p1.getName()  

        "clone是浅拷贝的" "clone是深拷贝的"

  

System.out.println(result);

打印出:

    clone是浅拷贝的

对于对象的浅拷贝和深拷贝还有更深的细节,可以参考:详解Java中的clone方法 -- 原型模式

1

2

3

public String toString() {

    return getClass().getName() + "@" + Integer.toHexString(hashCode());

}

toString()方法:toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

/*唤醒在此对象监视器上等待的单个线程。*/

public final native void notify();

/*唤醒在此对象监视器上等待的所有线程。*/

public final native void notifyAll();

/*在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。*/

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

 /* 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。*/

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

    }

/*在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。换句话说,此方法的行为就好像它仅执行 wait(0) 调用一样。   

当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。*/

public final void wait() throws InterruptedException {

        wait(0);

    }

1

protected void finalize() throws Throwable { }

finalize()方法:垃圾回收器准备释放内存的时候,会先调用finalize()。

  (1).  对象不一定会被回收。

(2).垃圾回收不是析构函数。

(3).垃圾回收只与内存有关。

(4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。

转自 https://www.cnblogs.com/myseries/p/7435395.html

Java Object类方法相关推荐

  1. Java Object 类方法解析

    本文标题大纲: 文章目录 前言 getClass hashCode equals clone 深拷贝和浅拷贝 toString wait / notify / notifyAll finalize 前 ...

  2. java Object解析

    java Object是所有对象的根父类,所有对象都直接或间接集成自该类. java 的Object类也比较简单,有equals(Object).toString().finalize() java方 ...

  3. Java Object.hashCode()方法

    Java Object.hashCode()方法 @(JAVA)[java] 更详细的内容可以参考<effective java>与<think in java> Object ...

  4. java object... arguments_Java面试之基础题---对象Object

    参数传递:Java支持两种数据类型:基本数据类型和引用数据类型. 原始数据类型是一个简单的数据结构,它只有一个与之相关的值.引用数据类型是一个复杂的数据结构,它表示一个对象.原始数据类型的变量将该值直 ...

  5. dbz用connector入hana报错Invalid Java object for schema type INT64: class java.util.Long for field “null“

    最近需要将用户的mysql数据实时导入到hana中. 方案一为:mysql-cdc---->debezium-source-connector---->kafka----->debe ...

  6. Java Math类方法介绍之史上最全

    Java Math类方法介绍之史上最全 开发中用到了Java Math类的方法,故温习记录如下. /*** 常量*/System.out.println("------>" ...

  7. JOL(java object layout --java 对象内存布局)

    JOL(java object layout --java 对象内存布局) ⚠⚠⚠本文以java普通对象为切入点,分析java的对象内存布局,数组见文末 maven地址

  8. JOL(java object layout): java 对象内存布局

    我们天天都在使用java来new对象,但估计很少有人知道new出来的对象到底长的什么样子?对于普通的java程序员来说,可能从来没有考虑过java中对象的问题,不懂这些也可以写好代码.今天,给大家介绍 ...

  9. 深入浅出Java Object Layout (JOL)

    基本介绍和使用 Java Object Layout (JOL) openjdk/jol github maven <!-- https://mvnrepository.com/artifact ...

最新文章

  1. 如何在您HTML中嵌入视频和音频
  2. linux make menuconfig 快速查找
  3. 行业牛人和开源软件改变技术世界
  4. 微软商业智能BI知识整合篇-五大工具产品系列文章
  5. [渝粤教育] 中国地质大学 高级会计学 复习题
  6. Android SDK+Eclipse+ADT+CDT+NDK 开发环境在windows 7下的搭建
  7. java zookeeper 主从热备_zookeeper 核心原理
  8. visio 2013破解
  9. Android开发案例 设置背景图片轮播
  10. 路径规划-人工势场法(Artificial Potential Field)
  11. Junos 操作系统
  12. java同构数_统计同构数关键算法
  13. cad批量等高线lisp_基于AutoCAD Lisp局部等高线自动内插新方法
  14. python使用金山词霸的翻译功能
  15. DOM元素 DAY17
  16. 商业价值(PgMP)
  17. uni-app的渲染数据和三种调接口的方法
  18. Scrapy是什么?Scrapy怎么用?Scrapy进阶使用[链接提取器、自动登录、图片(文件)下载器](基于scrapy2.0+编写) ๑乛◡乛๑ Scrapy框架使用方法
  19. photoshop第十五章:制作商业卡片场景效果
  20. android 自动上传手机图库,将iCloud照片传输到Android的3种方法

热门文章

  1. python抓取国家统计局省市区街道社区数据
  2. 【PHP MySQL】数据库专题 第二课 创建数据库 表
  3. SpringCloud中的application-test.yml剖析(以user模块为例)
  4. 开源办公OA平台教程:如何修改O2OA配置连接本地部署的OnlyOffice Docs Server服务器?
  5. Tomb.Finance的每周更新(3.14-3.20)
  6. 浅析融资担保公司如何接入征信系统?
  7. Kafka中数据清理(Log Deletion)
  8. Windows C盘清理之用户数据清理记录
  9. GoFrame的gmap相比Go原生的map,天然支持排序和有序遍历!?
  10. 偷袭“懒人经济“的自热食品,是一门赚钱的好生意吗?