MST
星途 面试题库

面试题:Java中抽象类与接口在设计思路上的主要区别

请详细阐述Java中抽象类与接口在设计思路上存在哪些主要区别,例如从成员变量、方法定义、继承与实现关系等方面进行分析。
45.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

成员变量

  • 抽象类:可以有各种访问修饰符的成员变量,包括private、protected、public等,且可以有具体的初始值。例如:
abstract class AbstractClass {
    private int privateVar = 10;
    protected String protectedVar = "abstract";
    public double publicVar = 3.14;
}
  • 接口:成员变量默认是public static final的,也就是常量,必须在声明时初始化。例如:
interface MyInterface {
    int CONSTANT = 100;
}

方法定义

  • 抽象类:可以包含抽象方法(只有声明,没有实现)和具体方法(有方法体)。抽象方法用于强制子类实现特定功能,具体方法为子类提供通用的实现。例如:
abstract class AbstractClass {
    // 抽象方法
    public abstract void abstractMethod();
    // 具体方法
    public void concreteMethod() {
        System.out.println("This is a concrete method.");
    }
}
  • 接口:所有方法默认是public abstract的,Java 8 开始接口可以有默认方法(使用default关键字)和静态方法,默认方法为实现接口的类提供可选的方法实现,静态方法通过接口名直接调用。例如:
interface MyInterface {
    void abstractMethod();
    default void defaultMethod() {
        System.out.println("This is a default method.");
    }
    static void staticMethod() {
        System.out.println("This is a static method.");
    }
}

继承与实现关系

  • 抽象类:使用extends关键字来继承抽象类,一个类只能继承一个抽象类。因为Java单继承机制,这限制了一个类从多个抽象类获取属性和行为。例如:
class SubClass extends AbstractClass {
    @Override
    public void abstractMethod() {
        System.out.println("Implemented abstract method.");
    }
}
  • 接口:使用implements关键字来实现接口,一个类可以实现多个接口,这使得类能够从多个接口获取不同的行为定义,实现更灵活的功能组合。例如:
class MyClass implements MyInterface, AnotherInterface {
    @Override
    public void abstractMethod() {
        System.out.println("Implemented method from MyInterface.");
    }
    // 实现AnotherInterface中的抽象方法
    @Override
    public void anotherAbstractMethod() {
        System.out.println("Implemented method from AnotherInterface.");
    }
}

设计目的

  • 抽象类:通常用于表示具有共同特征和行为的一组类的抽象概念,它将一些相关的属性和方法组织在一起,子类继承抽象类并根据自身需求扩展和细化这些属性和方法。适用于存在一定共性,且需要在抽象层面定义一些通用行为的场景。
  • 接口:主要用于定义一组行为规范,不关心实现类的具体继承体系,只关注实现类是否满足接口定义的行为。它更强调行为的一致性和可替代性,适用于需要实现不同类之间功能交互和组合的场景,使得不相关的类可以具有相同的行为。