一篇文章带你彻底了解Java Object类
在Java的世界中,有一个神秘的存在,它是所有类的根基,无所不在,无所不知。它就是——Object类。本文将带你深入探索Java中这个神秘之源,解密Object类的奥秘,让你更好地理解和使用Java的核心概念。
基本概念:
Object类是Java中所有类的超类(父类)。无论你创建了哪个类,你都在某种程度上间接地继承了Object类的属性和方法。它是Java中的根基,一切皆对象,一切皆从Object而来。
子类可以使用 Object 的所有方法。
Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类。
Object 类可以显式继承,也可以隐式继承,以下两种方式是一样的:
显式继承:
public class Runoob extends Object{
}
隐式继承:
public class Runoob {
}
类的构造函数
序号 | 构造方法 & 描述 |
---|---|
1 | **Object()**构造一个新对象。 |
类的方法
序号 | 方法 & 描述 |
---|---|
1 | protected Object clone()创建并返回一个对象的拷贝 |
2 | boolean equals(Object obj)比较两个对象是否相等 |
3 | protected void finalize()当 GC (垃圾回收器)确定不存在对该对象的有更多引用时,由对象的垃圾回收器调用此方法。 |
4 | Class getClass()获取对象的运行时对象的类 |
5 | int hashCode()获取对象的 hash 值 |
6 | void notify()唤醒在该对象上等待的某个线程 |
7 | void notifyAll()唤醒在该对象上等待的所有线程 |
8 | String toString()返回对象的字符串表示形式 |
9 | void wait()让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。 |
10 | void wait(long timeout)让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过参数设置的timeout超时时间。 |
11 | void wait(long timeout, int nanos)与 wait(long timeout) 方法类似,多了一个 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒。。 |
Object类的重要方法:equals和hashCode
Object类提供了一些重要的方法,其中最常用的是equals()
和hashCode()
方法。equals()
方法用于比较两个对象是否相等,而hashCode()
方法返回对象的哈希码。这两个方法在Java的集合框架中扮演着重要角色,影响着对象的相等性判断和存储方式。
public class ObjectExample {
public static void main(String[] args) {
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2)); // 输出 true
System.out.println(str1.hashCode()); // 输出哈希码
System.out.println(str2.hashCode());
}
}
输出结果:
true
69609650
69609650
上面的示例演示了如何使用equals()
方法比较两个对象的相等性,并使用hashCode()
方法获取对象的哈希码。
Object类的常用方法:toString和getClass
除了equals()
和hashCode()
方法外,Object类还提供了其他常用的方法。其中,toString()
方法返回对象的字符串表示,通常用于调试和日志记录。getClass()
方法返回对象的类类型。
public class ObjectExample {
public static void main(String[] args) {
String str = "Hello, Object!";
System.out.println(str.toString()); // 输出字符串表示
System.out.println(str.getClass()); // 输出类类型
}
}
输出结果:
Hello, Object!
class java.lang.String
上述示例演示了如何使用toString()
方法获取对象的字符串表示,以及如何使用getClass()
方法获取对象的类类型。
自定义类与Object类
每个Java类都直接或间接地继承了Object类。如果你没有明确指定一个类的父类,那么它默认继承自Object类。这意味着,你可以在自定义的类中使用Object类的方法,或者覆盖这些方法以满足特定需求。
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
public static void main(String[] args) {
Person person = new Person("Alice");
System.out.println(person); // 输出对象的字符串表示
}
}
输出结果:
Person{name='Alice'}
在上述示例中,我们自定义了一个Person类,并覆盖了Object类的toString()
方法,以自定义的方式返回对象的字符串表示。
Object类的多态性
Object类的存在赋予了Java类的多态性。由于每个类都继承自Object类,所以你可以将任何类的对象视为Object类型,从而实现通用的操作和存储。
public class ObjectPolymorphism {
public static void printClassName(Object obj) {
System.out.println("对象的类名:" + obj.getClass());
}
public static void main(String[] args) {
String str = "Hello, Object!";
printClassName(str);
Integer num = 42;
printClassName(num);
}
}
输出结果:
对象的类名:class java.lang.String
对象的类名:class java.lang.Integer
上述示例展示了Object类的多态性,通过传递不同类型的对象给通用方法,实现了通用的操作。
总结
Object类是Java中的根基,它为所有类提供了共同的属性和方法。通过掌握equals()
、hashCode()
、toString()
等方法,你能够更好地理解和操作对象。Object类的存在让Java的世界变得更加统一、灵活,为你的编程之旅赋予了更多可能性。
作者:Stevedash
发表于:2023年8月9日00点31分
注:本文内容基于个人对Java Object 类 | 菜鸟教程 (runoob.com)学习理解,如有错误或疏漏,欢迎指正。感谢阅读!如果觉得有帮助,请点赞和分享。