java面试:了解抽象类与接口么?讲一讲它们的区别

在java中抽象类与接口是在开发过程非常常用的两个类型,我们常常会发现很难区分这两类型,或者会发现有很多设计上的问题,因此面试过程当中无论是校招或者社招,都不免会提问到这两个类型,都是java在设计程序时十分重要的思想,今天小编就和大家来分享一下这方面的知识。

1.接口的基本概念和规范

接口是一种完全抽象的类型,它只定义方法的签名,不包含实现。接口定义了一组行为规范,实现类必须遵循这些规范,也就是定义了能做什么,接口有以下几个特性。

  • 所有方法默认是 public abstract(Java 8 之前)

  • 不能包含实例变量(只能是 public static final 常量)

  • 接口是支持多实现的

  • 接口是不能有构造方法的

由于接口是只关心行为约定,所以它不该承载实例状态,所以接口的所谓的变量天生就是常量,不过在java8之后接口就加入了default和static方法,使得接口能够进行方法的实现,这解决了 Java 接口的一个长期痛点:接口一旦发布,新增方法会导致所有实现类编译失败

java 复制代码
// 定义接口:飞行能力
public interface Flyable {
    // 常量(默认 public static final)
    int MAX_HEIGHT = 10000;
    
    // 抽象方法(默认 public abstract)
    void fly();
    
    void land();
    
    // Java 8+ 默认方法(有实现)
    default void takeOff() {
        System.out.println("准备起飞...");
    }
}

2.抽象类的基本概念和规范

抽象类是一种部分实现的类,它可以包含抽象方法和具体方法。抽象类用于定义"是什么",用于定义行为共同特征。

  • 可以包含抽象方法和具体方法

  • 可以有实例变量、构造方法

  • 一个类只能继承一个抽象类(单继承)

  • 用于定义共同特征和默认行为

抽象类的是需要承载复用逻辑的,所以要有成员变量,有构造方法,给与类的初始化,同时抽象类一般设计用于维护某一功能,帮助由于需求不断迭代的代码维护成本。

java 复制代码
// 抽象类定义共同特征
public abstract class PaymentMethod implements Payable {
    protected String accountNo;
    protected double balance;
    
    public PaymentMethod(String accountNo, double balance) {
        this.accountNo = accountNo;
        this.balance = balance;
    }
    
    // 具体方法:检查余额
    protected boolean hasSufficientBalance(double amount) {
        return balance >= amount;
    }
    
    // 具体方法:扣款
    protected void deduct(double amount) {
        balance -= amount;
    }
}

3.接口和抽象类的区别

整理成一张表

|-------|-------------------------------------|---------------------|
| 特性 | 接口(Interface) | 抽象类(Abstract Class) |
| 定义 | "能做什么"(能力、规范) | "是什么"(类别、模板) |
| 方法 | Java 8 前只能有抽象方法 Java 8+ 可有默认方法和静态方法 | 可以有抽象方法和具体方法 |
| 变量 | 只能是 public static final 常量 | 可以有各种访问修饰符的实例变量 |
| 构造方法 | 不能有 | 可以有 |
| 继承/实现 | 多实现(一个类可实现多个接口) | 单继承(一个类只能继承一个抽象类) |
| 访问修饰符 | 方法默认 public | 可以自定义访问修饰符 |
| 设计目的 | 解耦、定义规范、实现多态 | 代码复用、定义模 |

今天的分享就到这里了,希望这篇博客能给你一些帮助,让你对关于了解抽象类与接口的区别的问题得到进一步的提升,在面试的时候能从容面对面试官。

相关推荐
Hello eveybody3 分钟前
介绍一下背包DP(Python)
开发语言·python·动态规划·dp·背包dp
AI进化营-智能译站19 分钟前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
iCxhust23 分钟前
微机原理实践教程(C语言篇)---A002流水灯
c语言·开发语言·单片机·嵌入式硬件·51单片机·课程设计·微机原理
FQNmxDG4S39 分钟前
Maven依赖管理:版本冲突解决与生命周期控制
java·数据库·maven
莎士比亚的文学花园44 分钟前
Linux驱动开发(3)——设备树
开发语言·javascript·ecmascript
图码1 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
傻瓜搬砖人1 小时前
Spring集成Web环境
java·spring·maven
U盘失踪了1 小时前
python curl转python脚本
开发语言·chrome·python
charlie1145141911 小时前
Linux 字符设备驱动:cdev、设备号与设备模型
linux·开发语言·驱动开发·c
handler011 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法