【面试干货】抽象类和接口的区别


💖The Begin💖点点关注,收藏不迷路💖

在面向对象编程中,抽象类(abstract class)和接口(interface)是常用的概念,它们虽然有一些相似之处,但也有一些重要的区别。下面我们来详细比较一下这两者之间的异同。

1、抽象类

1.1、什么是抽象类?

声明方法的存在而不去实现它的类被叫做抽象类(abstract class)。抽象类用于创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现这些方法。

以下是抽象类的一些特性:

1、不能实例化:不能创建abstract class的实例。

2、可以包含具体方法和抽象方法:抽象类可以包含具体的方法实现和抽象方法。

3、子类必须实现抽象方法:抽象类的子类必须为其所有抽象方法提供实现,否则子类也必须声明为抽象类。

4、不能有抽象构造函数或抽象静态方法

1.2、示例代码

// 定义抽象类
abstract class Animal {
    // 抽象方法,没有方法体
    public abstract void makeSound();
    
    // 具体方法,有方法体
    public void sleep() {
        System.out.println("Sleeping...");
    }
}

// 子类实现抽象方法
class Dog extends Animal {
    public void makeSound() {
        System.out.println("Bark");
    }
}

2、接口

2.1、什么是接口?

接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。接口提供了一种多继承的机制,通过实现多个接口,类可以具有多重行为。

以下是接口的一些特性:

1、所有方法都是抽象的:接口中的所有方法默认都是public abstract,没有方法体。

2、只能定义静态常量:接口中只能包含static final成员变量。

3、实现类必须实现所有方法:实现接口的类必须实现接口中声明的所有方法。

4、接口允许多继承:一个类可以实现多个接口。

2.2、示例代码

// 定义接口
interface Animal {
    void makeSound(); // 抽象方法
}

// 类实现接口
class Dog implements Animal {
    public void makeSound() {
        System.out.println("Bark");
    }
}

3、比较和总结

  • 抽象类:用于定义基本行为,子类需要提供具体实现,不允许有抽象构造函数或抽象静态方法。

  • 接口:所有方法都是抽象的,实现多继承性,实现类需要提供所有方法的具体实现,只能包含静态常量。

3.1、使用场景

抽象类: 当需要为一组相关的类提供一个公共的基类并包含一些公共的代码实现时,使用抽象类。

接口: 当需要定义一组不相关类可以实现的行为,并且希望支持多继承时,使用接口。

3.2、关键区别

1、方法实现:

abstract class:可以包含具体的方法实现。

interface:所有方法都是抽象的,没有方法体。

2、成员变量:

abstract class:可以有普通成员变量。

interface:只能有static final常量。

3、继承:

abstract class:子类使用extends关键字继承,一个类只能继承一个抽象类。

interface:实现类使用implements关键字实现,一个类可以实现多个接口。

3.3、代码示例比较

// 使用抽象类
abstract class Vehicle {
    public abstract void startEngine(); // 抽象方法
    
    public void stopEngine() { // 具体方法
        System.out.println("Engine stopped.");
    }
}

class Car extends Vehicle {
    public void startEngine() {
        System.out.println("Car engine started.");
    }
}
// 使用接口
interface Vehicle {
    void startEngine(); // 抽象方法
}

interface Stopable {
    void stopEngine(); // 抽象方法
}

class Car implements Vehicle, Stopable {
    public void startEngine() {
        System.out.println("Car engine started.");
    }
    
    public void stopEngine() {
        System.out.println("Car engine stopped.");
    }
}

通过以上比较,我们可以看到,抽象类和接口各有优缺点,选择哪一种取决于具体的需求和设计目标。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

相关推荐

  1. 接口抽象区别

    2024-06-17 08:48:01       20 阅读
  2. 抽象接口区别你知道吗

    2024-06-17 08:48:01       11 阅读
  3. 接口抽象区别

    2024-06-17 08:48:01       16 阅读
  4. 接口抽象有什么区别

    2024-06-17 08:48:01       15 阅读
  5. 接口抽象

    2024-06-17 08:48:01       41 阅读
  6. 抽象接口

    2024-06-17 08:48:01       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-17 08:48:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-17 08:48:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-17 08:48:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-17 08:48:01       18 阅读

热门阅读

  1. 1、C++编程中的基本运算 - 课件

    2024-06-17 08:48:01       7 阅读
  2. SpringSecurity(JWT、SecurityConfig、Redis)

    2024-06-17 08:48:01       6 阅读
  3. API 类别 - 特效核心

    2024-06-17 08:48:01       5 阅读
  4. Linux 基础IO 三

    2024-06-17 08:48:01       6 阅读
  5. 你应该知道的口语连读技巧

    2024-06-17 08:48:01       6 阅读
  6. Rust创建基准测试bench

    2024-06-17 08:48:01       6 阅读
  7. AWS无服务器 应用程序开发—第十三章 小结2

    2024-06-17 08:48:01       5 阅读
  8. 迁移学习和从头训练(from scratch)的区别

    2024-06-17 08:48:01       6 阅读
  9. Conda编译

    2024-06-17 08:48:01       8 阅读
  10. Linux 常用命令 - userdel 【删除用户】

    2024-06-17 08:48:01       7 阅读
  11. SQL COUNT() 函数深入解析

    2024-06-17 08:48:01       5 阅读
  12. MySQL入门学习-子查询.ALL

    2024-06-17 08:48:01       8 阅读