💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
持续学习,不断总结,共同进步,为了踏实,做好当下事儿~
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
💖The Start💖点点关注,收藏不迷路💖
|
📒文章目录
【Java】抽象类与接口全解析
Java作为面向对象编程语言的代表,抽象类与接口是其核心特性之一,也是设计灵活、可扩展代码的关键工具。理解二者的区别、应用场景以及设计思想,对于编写高质量的Java代码至关重要。
1. 抽象类与接口的基本概念
1.1 什么是抽象类?
定义:使用abstract
关键字修饰的类,例如:
public abstract class Animal {
public abstract void eat(); // 抽象方法
public void sleep() { // 具体方法
System.out.println("Sleeping...");
}
}
特点:
- 不能直接实例化(
new Animal()
会编译报错) - 可包含抽象方法(无实现)和具体方法(有实现)
- 子类必须实现所有抽象方法(除非子类也是抽象类)
应用场景:
- 模板方法模式:定义算法骨架,子类实现具体步骤
- 代码复用:将公共逻辑放在抽象类中
1.2 什么是接口?
定义:使用interface
关键字定义行为契约,例如:
public interface Flyable {
void fly(); // 抽象方法
default void land() { // 默认方法(Java 8+)
System.out.println("Landing...");
}
static boolean isFlyable() { // 静态方法(Java 8+)
return true;
}
}
特点:
- 所有方法默认是
public abstract
(Java 8前) - 可包含常量(默认
public static final
) - 支持多继承(一个类可实现多个接口)
应用场景:
- 多继承:如
class Duck extends Bird implements Flyable, Swimmable
- 行为约定:如
Comparable
定义对象比较规则
1.3 抽象类与接口的异同
对比维度 | 抽象类 | 接口 |
---|---|---|
实例化 | 不能 | 不能(但可通过Lambda表达式) |
方法实现 | 可包含具体方法和抽象方法 | Java 8前只能有抽象方法 |
变量类型 | 无限制 | 只能是public static final |
继承 | 单继承 | 多继承 |
设计哲学:
- 抽象类强调"是什么"(如
Animal
是Dog
的父类) - 接口强调"能做什么"(如
Flyable
定义飞行能力)
选择建议:
- 需要代码复用时选抽象类
- 需要定义多组行为契约时选接口
2. 抽象类的深入解析
2.1 抽象类的定义与使用
抽象方法示例:
public abstract class Shape {
public abstract double area(); // 子类必须实现
public void printArea() { // 公共逻辑
System.out.println("Area: " + area());
}
}
构造方法的作用:
- 用于子类初始化时调用(即使抽象类不能实例化)
public abstract class Vehicle {
private String type;
public Vehicle(String type) { this.type = type; }
}
public class Car extends Vehicle {
public Car() { super("Car"); }
}
2.2 设计模式应用
模板方法模式:
abstract class Game {
abstract void initialize(); // 子类实现
abstract void startPlay();
public final void play() { // 固定流程
initialize();
startPlay();
}
}
class Cricket extends Game {
void initialize() { /* 具体实现 */ }
void startPlay() { /* 具体实现 */ }
}
2.3 局限性
- 单继承问题:若
Cat
已继承Animal
,则无法再继承其他类 - 灵活性不足:新增抽象方法会强制所有子类修改
3. 接口的深入解析
3.1 接口的演变(Java 8+)
默认方法:
interface Loggable {
default void log(String msg) { // 避免破坏现有实现
System.out.println("LOG: " + msg);
}
}
函数式接口:
@FunctionalInterface
interface Calculator {
int calculate(int a, int b); // 只能有一个抽象方法
}
3.2 多继承特性
解决默认方法冲突:
interface A { default void foo() { System.out.println("A"); } }
interface B { default void foo() { System.out.println("B"); } }
class C implements A, B {
@Override
public void foo() {
A.super.foo(); // 显式选择A的实现
}
}
3.3 设计模式应用
策略模式:
interface PaymentStrategy {
void pay(int amount);
}
class CreditCardPayment implements PaymentStrategy {
public void pay(int amount) { /* 信用卡支付逻辑 */ }
}
(因篇幅限制,后续章节简要概述)
4. 高级应用
- 组合使用:如
AbstractCollection
实现Collection
接口的通用方法 - JDK案例:
InputStream
是抽象类,Closeable
是接口
5. 常见面试题
- Q:抽象类可以有构造方法吗?
A:可以,但仅用于子类初始化
6. 总结
- 核心思想:抽象类用于"是什么",接口用于"能做什么"
- 推荐实践:优先使用接口,必要时结合抽象类
🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
💖The Start💖点点关注,收藏不迷路💖
|
idth=“50%”>
💖The Start💖点点关注,收藏不迷路💖