文章目录
前言
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~