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

一.什么是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:

API作用
Class getClass( )返回包含对象信息的类对象
boolean equals(Object otherObject )比较两个对象是否相等
String toString( )返冋描述该对象值的字符串。

java.lang.Class:

API作用
String getName( )返回这个类的名字
Class getSuperclass( )以 Class 对象的形式返回这个类的超类信息。

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值