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

网站首页 > 文章精选 正文

什么是抽象类和接口?它们之间有什么区别?什么情况下用?

balukai 2025-04-05 16:57:19 文章精选 6 ℃

“合抱之木,生于毫末;九层之台,起于累土。” 很多人对基础知识的巩固不够重视。Java 基础就如同大厦的基石,没有稳固的基石,再宏伟的架构也只是空中楼阁。


检验知识是否学得牢固,有一个比较好的办法,假设现在有个面试官问你这个问题,你是否脑瓜子嗡嗡的呢?



为了全面掌握基础知识,我们计划形成基础知识100问,破解大多数的JAVA面试涉及到的基础问题,不用去背八股文,掌握好基础就能灵活应对面试官的提问。


往期我们讨论过的主题有:


1. Java 基本数据类型有哪几种?它们各自所占的字节数是多少?


这里补充一下默认值


byte、short、int的默认值为0

long的默认值为0L

float的默认值为0.0f

double的默认值为0.0d

char的默认值为'\u0000'

boolean的默认值为false


2. JAVA自动装箱和拆箱是如何实现的?在什么场景下会自动发生?

3. Java中的String、StringBuilder和StringBuffer的区别,以及各自的适用场景

4. JAVA技术第4问:==和equals方法在比较对象时的区别是什么?在自定义类中如何正确重写equals方法

5. JAVA技术第5问:Java中的final关键字有哪些作用?分别应用在类、方法和变量上时会有什么效果?

今天咱们是第六问,探讨的内容是:"什么是Java中的抽象类和接口?它们之间有什么区别?在什么情况下应该使用抽象类,什么情况下应该使用接口?"


试想一下,如果不往下看,你是否能够完整地回答出这个问题呢? 如果答案是肯定的,那恭喜你,你可以节约些时间去学习别的知识了! 当然,“温故而知新”,如果您不忙的话,接着往下看也无妨。


1.抽象类


在Java中,抽象类是一种不能被实例化的类,它主要用于作为其他类的基类,提供一些通用的属性和方法。抽象类可以包含抽象方法和非抽象方法。

抽象方法

是一种只有声明而没有实现的方法,需要在子类中进行具体实现。

非抽象方法

具有完整的方法体,子类可以直接继承使用。

以下是一个抽象类的示例:

// 定义一个抽象类 Animal
abstract class Animal {
    // 抽象方法,子类必须实现
    public abstract void sound();
    // 非抽象方法,子类可以直接继承使用
    public void sleep() {
        System.out.println("Animal is sleeping.");
    }
}
// 定义一个 Dog 类继承自 Animal 类
class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Woof!");
    }
}

2. 接口

接口是一种特殊的抽象类型,它只包含常量和抽象方法。接口中的所有方法默认都是抽象的,所有字段默认都是public static final(常量)。接口主要用于定义一组规范,让实现类去实现这些规范。

以下是一个接口的示例:

// 定义一个接口 Flyable
interface Flyable {
    // 接口中的常量
    int MAX_SPEED = 100;
    // 抽象方法,实现类必须实现
    void fly();
}
// 定义一个 Bird 类实现 Flyable 接口
class Bird implements Flyable {
    @Override
    public void fly() {
        System.out.println("Bird is flying.");
    }
}

3. 抽象类和接口的区别

语法层面

成员变量

抽象类可以有普通成员变量,而接口中的成员变量只能是public static final类型的常量。

方法

抽象类可以包含抽象方法和非抽象方法,而接口中的方法默认都是抽象的(Java 8 及以后版本支持默认方法和静态方法)。

继承和实现

一个类只能继承一个抽象类,但可以实现多个接口。

设计层面

抽象类

表示的是一种“is-a”的关系,即子类是抽象类的一种具体实现,用于代码复用和提供通用的行为。

接口

表示的是一种“can-do”的关系,即实现类具备接口所定义的能力,用于定义规范和实现多态。

4. 使用场景

使用抽象类的场景

当多个类具有一些共同的属性和方法,并且这些类之间存在“is-a”的关系时,可以使用抽象类。例如,不同种类的动物都有吃、睡等行为,可以将这些行为抽象到一个抽象的Animal类中。

当需要为子类提供一些默认的实现时,可以使用抽象类。抽象类中的非抽象方法可以为子类提供通用的实现,子类可以直接继承使用。

使用接口的场景

当需要定义一组规范,让不同的类去实现这些规范时,可以使用接口。例如,不同的交通工具都可以有“移动”的能力,可以定义一个Moveable接口,让汽车、飞机等类去实现这个接口。

当需要实现多继承的效果时,可以使用接口。由于 Java 不支持类的多继承,但一个类可以实现多个接口,因此可以通过实现多个接口来达到类似多继承的效果。

最近发表
标签列表