在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 | 可以自定义访问修饰符 |
| 设计目的 | 解耦、定义规范、实现多态 | 代码复用、定义模 |
今天的分享就到这里了,希望这篇博客能给你一些帮助,让你对关于了解抽象类与接口的区别的问题得到进一步的提升,在面试的时候能从容面对面试官。