MST

星途 面试题库

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

请详细阐述Java中抽象类与接口在成员变量、方法定义、继承与实现关系等方面设计上的主要区别。
47.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

成员变量

  • 抽象类:可以拥有各种访问修饰符(private、protected、public 等)的成员变量,包括实例变量和静态变量,这些变量可以有初始值,也可以在后续代码中进行赋值。例如:
abstract class AbstractClass {
    private int privateVar = 10;
    protected String protectedVar;
    public static final double PI = 3.14;
}
  • 接口:成员变量默认都是 public static final 的,即全局常量,必须在声明时就进行赋值,且赋值后不可更改。例如:
interface MyInterface {
    int DEFAULT_VALUE = 0;
}

方法定义

  • 抽象类:可以包含抽象方法和具体方法。抽象方法只有方法声明,没有方法体,必须由子类实现;具体方法有完整的方法体,子类可以继承也可以重写。例如:
abstract class AbstractClass {
    // 抽象方法
    public abstract void abstractMethod(); 
    // 具体方法
    public void concreteMethod() {
        System.out.println("This is a concrete method.");
    }
}
  • 接口:接口中的方法默认都是 public abstract 的(Java 8 之前),只包含方法声明,没有方法体,必须由实现接口的类来实现。从 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.");
    }
}

继承与实现关系

  • 抽象类:一个类只能继承一个抽象类。继承抽象类的子类必须实现抽象类中的所有抽象方法,除非子类本身也是抽象类。例如:
abstract class AbstractClass {
    public abstract void abstractMethod(); 
}
class SubClass extends AbstractClass {
    @Override
    public void abstractMethod() {
        System.out.println("Implementation of abstract method.");
    }
}
  • 接口:一个类可以实现多个接口。实现接口的类必须实现接口中的所有抽象方法(除非该类是抽象类)。接口还可以继承其他接口,并且可以多继承。例如:
interface Interface1 {
    void method1();
}
interface Interface2 {
    void method2();
}
interface Interface3 extends Interface1, Interface2 {
    void method3();
}
class ImplementingClass implements Interface3 {
    @Override
    public void method1() {
        System.out.println("Implementation of method1.");
    }
    @Override
    public void method2() {
        System.out.println("Implementation of method2.");
    }
    @Override
    public void method3() {
        System.out.println("Implementation of method3.");
    }
}