Java中的包装类、Object类和String类(三)


前言

JDK中有三类特殊的类,前两篇博客写了包装类和String类,今天写一写万类之父——Object类。


一、Object是什么?

首先来讲讲为什么称之为万类之父,这是Java的设计者规定的,为什么这么做,目的在于参数统一化!java.lang.Object类是Java中所有类的共同父类,不需要显示extends,只要是Java的类,Object都是他们的父类。
在这里插入图片描述

很直白的解释,object作为面向对象编程的语言,用这个单词做参数很合理!

二、Object类的使用以及类内方法

1.Object传参

因为所有类都是object类的子类,因此方法参数若需要接受所有的类对象,可以使用Object类来接收Object类是参数的最高统一类型!
在这里插入图片描述

除了可以接受所有的类对象外,Object还可以接收所有的引用数据类型(接口和数组)。

在这里插入图片描述

2、Object内的方法

正因为Object是所有类的父类,因此Object类中的所有方法,子类中都有(可以直接调用,也可以重写后调用)。

我们先看看Object中都有哪些方法:

在这里插入图片描述
这些方法是所有类都有的,这里挑几个重点讲一下。

2.1 toString方法

使用该方法获取一个对象的具体信息,JDK源码如下:
在这里插入图片描述
这里返回的是包名+类名+“@”+一串地址

在这里插入图片描述

我们重写了Student类中的toString方法,Person类内部没有重写

重写了之后输出是这样的:
在这里插入图片描述
当将类的对象直接传入println方法中进行输出时,默认就会调用toString(所有对象都具备的方法)。

这里插一条tips:

IDEA中快捷生成构造函数、重写方法、toString、getter setter方法,使用alt+insert快捷键 肥肠好用!

2.2 equals()方法

对象的比较使用equals方法,这个之前提到过挺多次的,因为引用数据类型在栈中存储的是地址,所以当我们new了两个对象,即使存储的内容是一模一样的,但由于其指向的地址不同,使用==运算符时比较的是地址,equals比较的才是指向地址中的内容!!!

当然对于自定义的类我们同样需要重写equals方法

在这里插入图片描述
此时我们运行下面这些代码,可以看到:

在这里插入图片描述
在Java中,“==”操作符返回的是布尔值,比较两个变量的“数值”是否相等,因此对于a和b来说,变量存储的就是具体的内容值,自然返回true。 但是对于stu1和stu2这种引用类型,存储的是对象的地址。比较两者的地址显然是不同的。

注意:
在这里插入图片描述

这里的原因在之前写包装类时解释过:因为java针对-128—127之间的数据做了一个数据缓冲池,如果数据是该范围内的数,会从 IntegerCache 中取,然后比较。当需要进行自动装箱时,如果数字在 -128 至 127 之间时,会直接使用缓存中的对象,而不是重新创建一个对象。

Java中所有的常用数据类型String类、包装类、集合类都已经覆写过equals方法了,直接调用即可!

总结一下equals()和 ==的区别:

1.==比较的是两个变量的数值是否相等;对于基本类型,比较的就是具体保存的数值,对于引用类型比较的是两个引用类型的地址是否相同。
2.equals方法是Object类的默认方法,自定义类型覆写equals方法可以按照属性值来比较两个对象的内容是否相等。
3.==比较的是地址,equals比较的是两个对象的属性值是否相等

2.3 Object内的其他方法

1. clone()

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

2. getClass()

final方法,返回Class类型的对象,反射来获取对象。

3. toString()

该方法用得比较多,一般子类都有覆盖,来获取对象的信息。

4. finalize()

该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。

5. equals()

比较对象的内容是否相等

6. hashCode()

该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。

7. wait()

wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。

调用该方法后当前线程进入睡眠状态,直到以下事件发生。

其他线程调用了该对象的notify方法。
其他线程调用了该对象的notifyAll方法。
其他线程调用了interrupt中断该线程。
时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

8. notify()

该方法唤醒在该对象上等待的某个线程。

9. notifyAll()

该方法唤醒在该对象上等待的所有线程。


总结

以上就是今天要讲的内容,本文介绍了Object的使用以及类内方法equals()和toString()的作用及使用注意细则。希望能帮到跟我一样的小白,也希望看到的老铁多多支持QAQ~

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彭彭彭摆鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值