程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

面试官-抽象类必须要有抽象方法吗?

balukai 2025-04-05 16:57:23 文章精选 14 ℃

在Java中抽象类的定义就是不能直接进行实例化的类,在抽象类中可以包含抽象方法,也可以包含具体的实现方法。而抽象类的目的其实就是创建一个基础类,让各个子类来继承并且实现其中的抽象方法,有点类似于多态的感觉。简单来讲抽象类也是子类的一个行为规范的模板。

抽象类是否必须要要有抽象方法?

首先了解什么是抽象方法,抽象方法是一种没有实际方法体的方法声明,它仅仅是定义了一个方法的签名,例如指定了方法名、参数列表、返回类型登,并没有提供具体的内部实现逻辑。它是作为抽象类的一部分要求子类必须要实现,除非该子类也是一个抽象类,如下所示。

abstract returnType methodName(parameters);
  • abstract:标记该方法为抽象方法。
  • returnType:方法的返回类型(可以是任何类型,比如 voidintString 等)。
  • methodName:方法的名称。
  • parameters:方法的参数列表,方法可以有参数,也可以没有参数。

对于抽象类是否必须要有抽象方法,这个答案不是必须的,这也是很多面试题中考察的一个关键点,也就是说在一个抽象类中并不一定要求必须包含抽象方法。

如果一个类声明了abstract,就表示它是一个抽象类,而这个抽象类中可以包含零个或者是多个抽象方法,如下所示。

abstract class Animal {
    abstract void sound();  // 抽象方法
}

在上面的这个实现中,定义了一个Animal抽象类,然后包含了一个抽象方法sound()并且这个方法没有实现,也就是说在子类中需要实现这个方法。

abstract class Animal {
    // 抽象方法:没有方法体
    abstract void speak();
}

class Dog extends Animal {
    // 实现抽象方法
    void speak() {
        System.out.println("Woof! Woof!");
    }
}

同样,即使是一个抽象类中不包含任何的方法,它任然可以被定义为一个抽象类,在之前的介绍中,我们也提到了抽象类是可以有普通的方法实现的,只不过没有抽象方法的抽象类的作用通常是为了防止该类被直接实例化,并为子类提供一个基础模板。

abstract class Animal {
    void breathe() {  // 普通方法
        System.out.println("Breathing...");
    }
}

如上所示,Animal 类没有任何抽象方法,但它仍然是一个抽象类。虽然没有抽象方法,它依然不能被实例化,只能作为一个基类供子类继承。

什么时候使用没有抽象方法的抽象类?

上面我们提到,没有抽象方法的抽象类通常是作为一个基础类或者是模板类来使用,它提供了一些基础实现的功能,可以避免重复代码编写,子类继承了这些已经实现的方法之后,可以根据实际的需求来进行扩展,实际上就是一种多态的体现。

举个例子来讲,Java的 java.util.AbstractList 类就是一个没有抽象方法的抽象类。它提供了许多集合操作的默认实现,子类(如 ArrayList)可以继承这些方法,并且根据需要对某些方法进行覆盖,如下所示,给出上面那个抽象类的具体实现。

abstract class Animal {
    // 抽象方法:没有方法体
    abstract void speak();
}

class Dog extends Animal {
    // 实现抽象方法
    void speak() {
        System.out.println("Woof! Woof!");
    }
}

class Cat extends Animal {
    // 实现抽象方法
    void speak() {
        System.out.println("Meow!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.speak();  // 输出: Woof! Woof!

        Animal cat = new Cat();
        cat.speak();  // 输出: Meow!
    }
}

在这段代码中Animal 是一个抽象类,里面有一个抽象方法speak(),但是没有提供具体实现。DogCat 都继承了 Animal 类,并实现了 speak() 方法。并且每个子类都有自己独立的实现,表现出不同的动物叫声。

总结

抽象类不一定必须包含抽象方法。因为抽象类的目的是防止类被实例化,提供一个基础模板给子类继承。所以抽象类可以包含抽象方法,这些方法没有实现,子类必须实现它们;也可以不包含抽象方法,只有普通的已实现的方法。在这种情况下,抽象类更多是提供一些通用功能,而让子类根据需要来扩展。

最近发表
标签列表