【Java高级】深入浅出谈Object类

2021/5/9 1:25:12

本文主要是介绍【Java高级】深入浅出谈Object类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!


作者:Beyong
    
出处:https://blog.csdn.net/weixin_45965358/article/details/116533572?spm=1001.2014.3001.5502
    
本博客中未标明转载的文章归作者Beyong有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

文章目录

  • 一.什么是Object类
  • 二.Object的特点
  • 三.Object类的方法
    • 1.equals
    • 2.hashCode
    • 3.toString
    • 4.一些线程操作
  • 四.API

一.什么是Object类

Object是java中每一个类的“始祖”,每一个类都是由它扩展而来的。就像我们常说我们人类的祖先是亚当,夏娃,那就是我们都是由亚当夏娃衍生而来的。

在这里插入图片描述

在Java中,只有基本数据类型不是对象,其他类型都是对象,都扩展了Object类。

在这里插入图片描述

二.Object的特点

Object类位于java.lang包中,因为java.lang包在编译时自动导入,所以我们的Object类也会自动导入。

Object有两种继承的方式:
显示继承:
在这里插入图片描述
隐式继承:
当我们没有显示继承任何类时,都默认继承了Object。
在这里插入图片描述

三.Object类的方法

1.equals

Object.equals方法是比较两个对象是否相等,也就是比较两个对象引用指向的是不是同一个对象,当然也就是比较两个对象的内存地址是否相等。

package com.sdnu.test3;

/**
 * @ version: 1.8
 * @ author: Beyong
 * @ date: 2021/5/8 17:02
 * @ Description: TODO
 */
public class ExtendsTest {
    public static void main(String[] args){
        Object s1 = new Object();
        Object s2 = new Object();
        Object s3 = s1;
        System.out.println("s1 equals s2 is : " + s1.equals(s2));
        System.out.println("s1 equals s3 is : " + s1.equals(s3));
    }
}

在这里插入图片描述

在这里插入图片描述

然而,在实际的开发过程中,判断两个对象的引用是否相等并没有什么实际的意义。所以我们的许多方法都重写了equals方法,但要注意如果子类重写了 equals() 方法,就需要重写 hashCode() 方法,比如String类就重写了equals(),用来判断两个字符串是否相等。

package com.sdnu.test3;

/**
 * @ version: 1.8
 * @ author: Beyong
 * @ date: 2021/5/8 17:43
 * @ Description: TODO
 */
public class ExtendsTest2 {
    public static void main(String[] args){
        String s3 = new String("java");
        String s4 = new String("python");
        String s5 = new String("java");
        String s6 = s5;
        System.out.println("s3 equals s4 is : " + s3.equals(s4));
        System.out.println("s3 equals s5 is : " + s3.equals(s5));
        System.out.println("s5 equals s6 is : " + s5.equals(s6));
    }
}

在这里插入图片描述

补充:我们重写equals要符合一定的规范:

  • 自反性:对于任何非空引用 x, x.equals(x) 应该返回 true
  • 对称性: 对于任何引用 x 和 y, 当且仅当 y.equals(x) 返回 true , x.equals(y) 也应该返回 true。
  • 传递性: 对于任何引用 x、 y 和 z, 如果 x.equals(y) 返 N true, y.equals(z) 返回 true,x.equals(z) 也应该返回 true。
  • 一致性: 如果 x 和 y 引用的对象没有发生变化,反复调用 x.eqimIS(y) 应该返回同样的结果
  • 对于任意非空引用 x, x.equals(null) 应该返回 false,

2.hashCode

Object hashCode() 方法用于获取对象的 hash 值。
(简单说一下hash值,Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。hash值保证逻辑上的唯一性,比如字符串相同,则hash值相同,而地址值保证地址的唯一性,地址值是由系统分配的,不可能相同)

hashCode与equal的关系:
如果 x.equals(y) 返回 true, 那么 x.hashCode( ) 就必须与 y.hashCode( ) 具有相同的值

package com.sdnu.test3;

/**
 * @ version: 1.8
 * @ author: Beyong
 * @ date: 2021/5/8 17:43
 * @ Description: TODO
 */
public class ExtendsTest2 {
    public static void main(String[] args){
        String s3 = new String("java");
        String s4 = new String("python");
        String s5 = new String("java");
        String s6 = s5;
        System.out.println("s3:" + s3.hashCode());
        System.out.println("s4:" + s4.hashCode());
        System.out.println("s5:" + s5.hashCode());
        System.out.println("s6:" + s6.hashCode());
        System.out.println("s3 equals s4 is : " + s3.equals(s4));
        System.out.println("s3 equals s5 is : " + s3.equals(s5));
        System.out.println("s5 equals s6 is : " + s5.equals(s6));
    }
}

在这里插入图片描述

3.toString

Object.toString() 方法用于返回对象的字符串表示形式。

package com.sdnu.test3;

/**
 * @ version: 1.8
 * @ author: Beyong
 * @ date: 2021/5/8 21:24
 * @ Description: TODO
 */
public class ExtendsTest3 {
    public static void main(String[] args){
        MyTest s4 = new MyTest();
        System.out.println(s4.toString());
    }
}
class MyTest{

}

在这里插入图片描述

返回类型为:对象的 class 名称 + @ + hashCode 的十六进制字符串

4.一些线程操作

void notify()
唤醒在该对象上等待的某个线程

void notifyAll()
唤醒在该对象上等待的所有线程

void wait()
让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

void wait(long timeout)
让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过参数设置的timeout超时时间。

void wait(long timeout, int nanos)
与 wait(long timeout) 方法类似,多了一个 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒。

四.API

java.lang.Object:

Class getClass( )
返回包含对象信息的类对象。

boolean equals(Object otherObject )
比较两个对象是否相等

String toString( )
返冋描述该对象值的字符串。

java.lang.Class:

String getName( )
返回这个类的名字

Class getSuperclass( )
以 Class 对象的形式返回这个类的超类信息。



这篇关于【Java高级】深入浅出谈Object类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程