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 | 可以自定义访问修饰符 |
| 设计目的 | 解耦、定义规范、实现多态 | 代码复用、定义模 |

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

相关推荐
凤山老林2 小时前
04-Java JDK, JRE和JVM
java·开发语言·jvm
小成202303202658 小时前
Linux高级02
linux·开发语言
camellias_8 小时前
【无标题】
java·tomcat
知行合一。。。8 小时前
Python--04--数据容器(总结)
开发语言·python
咸鱼2.08 小时前
【java入门到放弃】需要背诵
java·开发语言
ZK_H8 小时前
嵌入式c语言——关键字其6
c语言·开发语言·计算机网络·面试·职场和发展
A.A呐8 小时前
【C++第二十九章】IO流
开发语言·c++
椰猫子8 小时前
Java:异常(exception)
java·开发语言
lifewange8 小时前
pytest-类中测试方法、多文件批量执行
开发语言·python·pytest
cmpxr_9 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法