Java的Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,本文主要来和大家讲讲Object 类的使用,感兴趣的可以了解一下
Object 类提供的方法
方法实例
clone() 方法
equals() 方法
finalize() 方法
getClass() 方法
hashCode() 方法
wait() 方法
notify() 与 notifyAll() 方法
toString() 方法
Java的Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法。Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类。
Object 类可以显式继承,也可以隐式继承,以下两种方式是一样的:
1
2
// 显式继承:
public class Runoob extends Object{ }
1
2
// 隐式继承:
public class Runoob { }
Object 类提供的方法
方法 描述
Object() 构造一个新对象
protected Object clone() 创建并返回一个对象的拷贝
boolean equals(Object obj) 比较两个对象是否相等
protected void finalize() 当 GC (垃圾回收器)确定不存在对该对象的有更多引用时,由对象的垃圾回收器调用此方法
Class<?> getClass() 获取对象的运行时对象的类
int hashCode() 获取对象的 hash 值
void notify() 唤醒在该对象上等待的某个线程
void notifyAll() 唤醒在该对象上等待的所有线程
String toString() 返回对象的字符串表示形式
void wait() 让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法
void wait(long timeout) 让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过参数设置的timeout超时时间
void wait(long timeout, int nanos) 与 wait(long timeout) 方法类似,多了一个 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒
方法实例
clone() 方法
1
protected native Object clone() throws CloneNotSupportedException;
描述:
用于创建并返回一个对象的拷贝。clone 方法是浅拷贝,对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存。
参数:
无
返回值:
返回一个对象的拷贝。
注意:
由于 Object 本身没有实现 Cloneable 接口,所以不重写 clone 方法并且进行调用的话会发生 CloneNotSupportedException 异常。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class Test implements Cloneable {
// 声明变量
String name;
int likes;
// 属性引用的对象
JueJin jueJin;
Test() {
this.jueJin = new JueJin();
}
public static void main(String args[]) {
// 创建对象
Test obj1 = new Test();
// 初始化变量
obj1.name = "Runoob";
obj1.likes = 111;
obj1.jueJin.name = "掘金";
// 打印输出
System.out.println("obj1 的 name = " + obj1.name); // Runoob
System.out.println("obj1 的 likes = " + obj1.likes); // 111
System.out.println("obj1 的 jueJin 的 name = " + obj1.jueJin.name); //掘金
try {
// 创建 obj1 的拷贝
Test obj2 = (Test) obj1.clone();
obj2.name = "JueJin";
obj2.likes = 222;
obj2.jueJin.name = "稀土掘金";
// 使用 obj2 输出变量
System.out.println();
System.out.println("obj2 的 name = " + obj2.name); // JueJin
System.out.println("obj2 的 likes = " + obj2.likes); // 222
System.out.println("obj2 的 jueJin 的 name = " + obj2.jueJin.name); //稀土掘金
System.out.println();
System.out.println("浅拷贝的问题");
System.out.println("obj1 的 name = " + obj1.name); // Runoob
System.out.println("obj1 的 likes = " + obj1.likes); // 111
System.out.println("obj1 的 jueJin 的 name = " + obj1.jueJin.name); //稀土掘金
} catch (Exception e) {
System.out.println(e);
}
}
}
class JueJin {
public String name;
}
// 以上程序执行结果为:
// obj1 的 name = Runoob
// obj1 的 likes = 111
// obj1 的 jueJin 的 name = 掘金
// obj2 的 name = JueJin
// obj2 的 likes = 222
// obj2 的 jueJin 的 name = 稀土掘金
// 浅拷贝的问题
// obj1 的 name = Runoob
// obj1 的 likes = 111
// obj1 的 jueJin 的 name = 稀土掘金
解析:
由于浅拷贝对对象内属性引用的对象只会拷贝引用地址,所以 obj1 与 obj2 的 jueJin 属性引用的对象指向同一内存地址,所以在 obj2 修改 jueJin 的 name 属性后,obj1 的 jueJin 的 name 属性也发生了变化。
equals() 方法
1
public boolean equals(Object obj)
描述:
用于比较两个对象是否相等。比较两个对象时,是通过判断两个对象引用指向的是同一个对象,即比较 2 个对象的内存地址是否相等。
参数:
obj -- 要比较的对象。
返回值:
如果两个对象相等返回 true,否则返回 false。
注意:
不同的类重写了 equals() 方法,导致equals() 方法的行为有所不同。但如果子类重写了 equals() 方法,就需要重写 hashCode() 方法,比如 String 类就重写了 equals() 方法,同时也重写了 hashCode() 方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test implements Cloneable {
public static void main(String args[]) {
// 创建两个对象
Object obj1 = new Object();
Object obj2 = new Object();
// 判断 obj1 与 obj2 是否相等
// 不同对象,内存地址不同,不相等,返回 false
System.out.println(obj1.equals(obj2)); // false
// obj1 赋值给 obj3
// 对象引用,内存地址相同,相等,返回 true
Object obj3 = obj1;
System.out.println(obj1.equals(obj3)); // true
}
}
// 以上程序执行结果为:
// false
// true
finalize() 方法
1
protected void finalize() throws Throwable { }
描述:
用于实例被垃圾回收器回收的时触发的操作。当 GC (垃圾回收器) 确定不存在对该对象的有更多引用时,对象的垃圾回收器就会调用这个方法。
参数:
无
返回值:
无
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test {
public static void main(String args[]) {
JunJin junJin = new JunJin();
junJin = null;
System.gc();
}
}
class JunJin {
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("对象被回收了");
}
}
// 以上程序执行结果为:
// 对象被回收了
getClass() 方法
1
public final native Class<?> getClass();
描述:
用于获取对象的运行时对象的类。
参数:
无
返回值:
返回对象的类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test {
public static void main(String args[]) {
// getClass() with Object
Object obj1 = new Object();
System.out.println("obj1 的类为: " + obj1.getClass());
// getClass() with String
String obj2 = new String();
System.out.println("obj2 的类为: " + obj2.getClass());
// getClass() with ArrayList
ArrayList<Integer> obj3 = new ArrayList<>();
System.out.println("obj3 的类为: " + obj3.getClass());
}
}
// 以上程序执�