Java 中接口(Interface)和抽象类(Abstract Class)是实现抽象层次结构的两种机制。它们都不能被实例化,但有以下主要区别:
  1. 使用意图:
    • 接口:定义了一个完全抽象的合同,用于描述类具备哪些方法,而不关心这些方法的具体实现。
    • 抽象类:为子类提供了一个共同的基础框架,可以包含方法的实现细节。
  2. 默认行为:

    • 接口中声明的方法默认是 public 和 abstract 的,并且从 Java 8 开始,接口还可以含有默认(default)和静态(static)方法。
    • 抽象类中可以有非抽象的方法,即包含方法的实现,也可以包含状态(字段或属性)。
  3. 多继承:

    • 接口支持多继承,一个类可以实现多个接口。
    • 抽象类不支持多继承,一个类只能继承一个抽象类。
  4. 状态维护:

    • 接口不能包含实例字段(即状态),所有成员变量默认是 public static final 的。
    • 抽象类可以有实例变量,可以维护状态。
  5. 构造器:

    • 接口不能有构造器因为它们不能被实例化。
    • 抽象类可以有构造器,虽然抽象类不能直接实例化,但构造器可以在子类中通过 super()被调用。
  6. 访问修饰符:

    • 接口中的方法只能是 public 或者省略(默认是 public)。
    • 抽象类中的方法可以有 public、protected 和 private 访问级别。

举个栗子

假设我们设计一个系统来表示几何形状:
// 定义一个接口 Shape
public interface Shape {
    double getArea();
    // 计算面积
}

// 使用抽象类 AbstractShape 提供一些共同的功能
public abstract class AbstractShape implements Shape {
    protected String color;

    public AbstractShape(String color) {
        this.color = color;
    } // 抽象方法 

    @Override
    public abstract double getArea();

    // 非抽象方法 
    public String getColor() {
        return color;
    }
}// 具体类 Circle 继承自抽象类 AbstractShape 

public class Circle extends AbstractShape {
    private double radius;

    public Circle(double radius, String color) {
        super(color);
        this.radius = radius;
    }

    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}// 另一个具体类 Rectangle 实现接口 Shape

public class Rectangle implements Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double getArea() {
        return width * height;
    }
}
在此示例中:
  • Shape 接口定义了计算面积的合同。
  • AbstractShape 抽象类实现了 Shape 接口并提供了颜色属性和构造器。
  • Circle 类继承了 AbstractShape 并具体实现了计算面积的方法。
  • Rectangle 类直接实现了 Shape 接口,并没有从 AbstractShape 继承颜色属性。

本篇文章来源于微信公众号: 互联网面试小帮手



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2024-08-02