Object类的方法简谈
Java中所有的类都继承自Object类,那我们今天来探讨一下Object类中的方法
PS:Object源码中,作者那一栏中,出现了这个
package java.lang;
/**
* Class {@code Object} is the root of the class hierarchy.
* Every class has {@code Object} as a superclass. All objects,
* including arrays, implement the methods of this class.
*
* @author unascribed
* @see java.lang.Class
* @since JDK1.0
*/
public class Object {
....
}
unascribed,意思是无归属,我猜测是这个类经由很多大佬修改过,无法确定谁是主要作者,便写了无归属。说歪了,回到正题吧!
Object类有以下这几个方法(按照源码中的顺序)
【1】getClass():Class<?>
【2】hashCode():int
【3】equals(Object):boolean
【4】clone():Object
【5】toString():String
【6】notify():void
【7】notifyAll():void
【8】wait(long):void
【9】wait(long,int):void
【10】wait():void
【11】finalize():void
方法说明
【1】getClass():Class<?>
返回该对象运行时类的Class对象,通俗点,就是这个对象所属的类
代码说明
public static void testGetClass() {
ObjectTest test = new ObjectTest();
System.out.println(test.getClass());
}
输出为
可以看得出是输出的结构是 class 包名.类名
【2】hashCode():int
返回该对象的哈希值
(1)同一个对象的哈希值一定相同
(2)不同对象的哈希值可能相同,而不是绝对不相同
(3)哈希值一般用来提高查询的效率
(4)HashSet使用对象的hashcode与equals来判断是否插入了重复对象
代码演示
public static void testHashCode(){
System.out.println("同一个对象");
ObjectTest test = new ObjectTest();
System.out.println(test.hashCode());
System.out.println(test.hashCode());
System.out.println("两个不同的对象");
System.out.println(new ObjectTest().hashCode());
System.out.println(new ObjectTest().hashCode());
}
输出为
【3】equals(Object):boolean
判断两个对象内存地址是否相同,方法内部直接 return (this==object)
注意(1)凡是涉及到new的操作,均返回false,因为这是在堆中实例化了新的对象
代码演示
public static void testEquals() {
System.out.println(new ObjectTest().equals(new ObjectTest()));
}
输出为
(2)equals返回true的两个对象,其哈希值一定相同
(3)哈希值相同的两个对象,equals不一定返回true
【4】clone():Object
创建一个对象的副本
注意
(1)创建出来的是新的对象,equals返回false
(2)clone()不会调用构造方法
(3)当前类需要实现Cloneable标识接口,当前类对象才支持clone()方法
代码演示
public class ObjectTest implements Cloneable{
......
public static void testClone(){
ObjectTest objectTest=new ObjectTest();
try {
ObjectTest objectTest1= (ObjectTest) objectTest.clone();
System.out.print(objectTest.equals(objectTest1));
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
...
testClone();
}
}
输出为false
【5】toString():String
将对象转换成字符串表达形式
(1)不重写这个方法,直接调用则是输出当前对象在内存中的首地址
(2)重写这个方法后,输出该对象的属性
代码演示
不重写toString()方法
package day0807;
public class ObjectTest implements Cloneable {
public String name;
public int age;
public ObjectTest() {
}
public ObjectTest(String name, int age) {
this.name = name;
this.age = age;
}
....
public static void testToString() {
ObjectTest objectTest = new ObjectTest("tom", 22);
System.out.println(objectTest.toString());
}
public static void main(String args[]) {
...
testToString();
}
}
输出为
重写后
@Override
public String toString() {
return "ObjectTest{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
输出为
【6】notify():void
【7】notifyAll():void
【8】wait(long):void
【9】wait(long,int):void
【10】wait():void
这几个方法体现的是java中的多线程
(1)wait()使当前线程挂起并进入到该对象的等待队列中
(2)从当前对象的等待队列中随机唤醒一个挂起的线程,通知该线程可以运行
(3)唤醒当前对象的等待队列中的所有线程
(4)wait(long)与wait(long,int)为下一次自动唤醒距离现在释放锁的时间间隔
[关于这几个方法,涉及到的知识比较多,我会单独拎出来]
【11】finalize():void
JVM在回收对象所占的内存之前调用该方法
(1)当对象不再被任何变量所引用时,会调用这个方法
代码演示
public static void testFinalize() {
ObjectTest objectTest = new ObjectTest();
//将引用强制置为null
objectTest = null;
//通知gc开始工作,但gc何时工作无法控制,只是通知
System.gc();
}
输出为