上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(三十)-CSDN博客
六十一、Java 所有类的祖先类是哪个?
在Java语言中,所有的类都有一个共同的祖先类,即java.lang.Object
。Object
类位于Java类继承层次结构的顶端,是所有Java类的根类。这意味着所有的Java类(无论是基本数据类型对应的包装类,还是用户自定义的类)默认都是Object
类的子类,除非它们显式地继承了另一个类。
Object
类的特点
- 根类:
Object
类是继承层次结构的根,没有父类。 - 方法:
Object
类提供了一些基础的方法,如equals()
、hashCode()
、toString()
、clone()
(受保护的)、finalize()
(已过时,不推荐使用)和getClass()
。 - 继承:所有用户定义的类默认继承自
Object
类,除非它们继承自另一个类。
示例
public class MyClass {
// ...
}
// 等同于
public class MyClass extends Object {
// ...
}
在第一个示例中,即使没有显式写出extends Object
,MyClass
也被默认视为继承自Object
类。
Object
类方法的作用
equals(Object obj)
:检查两个对象是否相等。hashCode()
:返回对象的哈希码值。toString()
:返回对象的字符串表示。clone()
:创建并返回对象的一个副本。getClass()
:返回对象的Class
对象,表示对象的运行时类。
注意事项
- 当创建一个新类而没有指定其父类时,Java编译器会自动将
Object
类作为该类的父类。 - 由于
Object
类的方法具有默认实现,很多Java类会重写这些方法以提供更适合具体类的实现。
总结
java.lang.Object
类是Java所有类继承层次结构的根,提供了一些基础的实例方法,这些方法在对象的相等性比较、哈希计算、字符串表示等方面有广泛的应用。理解Object
类及其方法对于深入掌握Java面向对象编程非常重要。
六十二、Object 类有哪些常用的方法?
Java中的Object
类位于类继承层次结构的顶端,是所有Java类默认继承的基类。Object
类提供了一些常用的方法,这些方法在Java编程中非常有用,以下是Object
类的一些常用方法:
-
equals(Object obj)
:- 用于检查当前对象与传入的对象是否相等。默认实现比较的是对象引用,但通常需要重写以提供有意义的比较逻辑。
-
hashCode()
:- 返回对象的哈希码值。通常与
equals()
方法配合使用,如果两个对象通过equals()
方法比较是相等的,那么它们的hashCode()
方法必须返回相同的整数。
- 返回对象的哈希码值。通常与
-
toString()
:- 返回对象的字符串表示。默认实现返回对象的类名和哈希码的无符号十六进制表示,但通常需要重写以提供更有用的字符串表示。
-
getClass()
:- 返回对象的
Class
对象,可以用来获取类的类型信息。
- 返回对象的
-
wait()
:- 导致当前线程等待,直到另一个线程调用当前对象的
notify()
或notifyAll()
方法。
- 导致当前线程等待,直到另一个线程调用当前对象的
-
notify()
:- 唤醒在当前对象监视器上等待的单个线程。
-
notifyAll()
:- 唤醒在当前对象监视器上等待的所有线程。
-
clone()
:- 受保护的方法,用于创建并返回当前对象的一个副本。默认实现是浅拷贝,但大多数类会重写此方法以实现深拷贝或出于安全考虑抛出
CloneNotSupportedException
。
- 受保护的方法,用于创建并返回当前对象的一个副本。默认实现是浅拷贝,但大多数类会重写此方法以实现深拷贝或出于安全考虑抛出
-
finalize()
:- 已过时,不推荐使用。在对象被垃圾回收器回收前调用,用于执行清理工作。由于其不确定性和安全问题,Java 9开始标记为过时,并在Java 10中移除。
示例
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
@Override
public String toString() {
return "Person{name='" + name + "'}";
}
// 其他方法...
}
在这个示例中,Person
类重写了Object
类的equals()
、hashCode()
和toString()
方法,以提供具体的实现逻辑。
注意事项
- 重写
equals()
方法时,应该总是重写hashCode()
方法,以维护HashMap
等哈希表的一致性。 wait()
、notify()
和notifyAll()
方法是用于线程间通信的,并且只能在同步方法或同步块中使用。clone()
方法需要正确实现以避免共享可变对象,或者在必要时抛出CloneNotSupportedException
。
总结
Object
类提供的这些方法在Java编程中非常基础且常用。重写这些方法可以改变默认行为,以适应特定类的需求,特别是在涉及到对象比较、哈希表使用、线程通信和对象克隆时。