上一篇地址:持续总结中!2024年面试必问 100 道 Java基础面试题(二十七)-CSDN博客
五十五、Object类有哪些常用的方法?
Java中的Object
类是所有Java类的根类,它位于类继承层次结构的顶端。Object
类提供了一些基础的方法,这些方法在Java编程中非常常用。以下是Object
类的一些常用方法:
-
equals(Object obj)
:- 用于检查两个对象是否相等。默认实现比较的是对象的内存地址,但通常需要被重写以提供基于内容的比较。
-
hashCode()
:- 返回对象的哈希码值。通常与
equals()
方法配合使用,如果两个对象通过equals()
比较是相等的,那么它们的hashCode()
值也必须相等。
- 返回对象的哈希码值。通常与
-
toString()
:- 返回对象的字符串表示。默认实现返回一个字符串,该字符串由类名、符号“@”以及对象的哈希码的无符号十六进制表示组成。通常需要被重写以提供更有用的字符串表示。
-
getClass()
:- 返回对象的
Class
对象,可以用来获取类的类型信息。
- 返回对象的
-
wait()
:- 导致当前线程等待,直到另一个线程调用同一个对象的
notify()
或notifyAll()
方法。
- 导致当前线程等待,直到另一个线程调用同一个对象的
-
notify()
:- 唤醒在此对象监视器上等待的单个线程。
-
notifyAll()
:- 唤醒在此对象监视器上等待的所有线程。
-
clone()
:- 创建并返回对象的一个副本。这是一个受保护的方法,并且需要在子类中被重写为
public
。默认实现抛出CloneNotSupportedException
。
- 创建并返回对象的一个副本。这是一个受保护的方法,并且需要在子类中被重写为
-
finalize()
:- 由垃圾回收器在对象被垃圾回收前调用,用于在对象被回收前进行清理工作。由于其不确定性和不推荐使用,通常不推荐重写此方法。
示例代码
public class MyClass extends Object {@Overrideprotected Object clone() throws CloneNotSupportedException {// 实现克隆逻辑return super.clone(); // 调用Object类的clone()方法}@Overridepublic boolean equals(Object obj) {// 实现equals逻辑if (this == obj) return true;if (obj == null || getClass() != obj.getClass()) return false;return true;}@Overridepublic int hashCode() {// 实现hashCode逻辑return super.hashCode(); // 可以使用Object类的默认实现或者提供自定义实现}@Overridepublic String toString() {// 实现toString逻辑return "MyClass{" + "someField='" + someField + '\'' + '}';}// 其他自定义方法和属性
}
在这个示例中,MyClass
继承自Object
类,并重写了clone()
、equals()
、hashCode()
和toString()
方法。
注意事项
- 重写
equals()
方法时,通常也需要重写hashCode()
方法,以维护两者的一致性。 Object
类的wait()
、notify()
和notifyAll()
方法与同步和多线程编程紧密相关,它们在对象的同步方法或同步代码块中使用。finalize()
方法在Java中通常不推荐使用,因为它的行为是不确定的,并且在Java 9中被标记为过时(deprecated)。
Object
类的方法为Java对象提供了基本的操作,这些方法的重写可以实现类的具体行为,是面向对象编程中多态和封装的重要体现。
五十六、普通类和抽象类有什么区别?
在Java中,类可以根据它们的特性被定义为普通类(也称为具体类)或抽象类。以下是普通类和抽象类之间的区别:
普通类(具体类)
- 定义:普通类是完整的类定义,它包含了数据成员(属性)和方法的实现。
- 实例化:你可以创建普通类的实例,即普通类的对象。
- 方法实现:普通类中的方法必须提供完整的实现细节。
- 构造器:普通类可以有构造器,并且可以没有抽象方法。
- 继承:普通类可以继承其他普通类或抽象类。
- 使用场景:当类的设计是完整的,并且不需要被其他类继承以实现未定义的方法时,使用普通类。
抽象类
- 定义:抽象类是一种不完整的类定义,它允许包含抽象方法,即没有方法体的方法。
- 实例化:你不能直接创建抽象类的实例。如果尝试实例化一个抽象类,Java编译器会报错。
- 方法实现:抽象类可以包含抽象方法,也可以包含已经实现的方法。
- 构造器:抽象类可以有构造器,但只能通过子类实例来调用。
- 继承:抽象类可以继承其他抽象类或普通类,并可以被其他普通类继承。
- 使用场景:当类设计为其他类的基类,并且你希望定义一些通用的属性和方法,同时为派生类留下一些实现细节时,使用抽象类。
示例代码
// 抽象类
abstract class Animal {abstract void makeSound(); // 抽象方法void eat() { // 具体方法System.out.println("This animal eats food.");}
}// 普通类
class Dog extends Animal {@Overridevoid makeSound() {System.out.println("Woof woof!");}public static void main(String[] args) {// Animal animal = new Animal(); // 错误:不能实例化抽象类Dog dog = new Dog(); // 正确:Dog继承自Animal,并且实现了makeSound()方法dog.makeSound(); // 输出 "Woof woof!"dog.eat(); // 输出 "This animal eats food."}
}
在这个示例中,Animal
是一个抽象类,它包含一个抽象方法makeSound()
和一个具体方法eat()
。Dog
是一个普通类,它继承自Animal
并提供了makeSound()
方法的实现。
注意事项
- 抽象类通常用作基类,它们定义了一组相关类的通用接口。
- 抽象类可以有成员变量和具体方法的实现,这使得它们可以有部分实现的细节。
- 普通类实现所有的方法,而抽象类至少有一个未实现的方法。
- 抽象类不能被实例化,但可以被继承,继承的普通类必须实现所有的抽象方法(除非该普通类也是抽象的)。
总结来说,普通类提供了类的完整实现,适合创建对象;而抽象类提供了类的框架,它定义了一些方法的签名,但留给继承的类去实现具体的功能。抽象类是实现代码复用和多态性的重要手段。