Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 3.5 接口与抽象类

3.5 接口与抽象类

1. 接口(Interface)

1.1 接口的定义与特性

  • 定义:接口是Java中一种完全抽象的类,用于定义一组方法的规范(抽象方法集合)。
  • 特性:
    • 使用interface关键字声明。
    • 默认所有方法为public abstract(可省略修饰符)。
    • 接口中可包含常量(默认public static final)。
    • Java 8后支持默认方法(default)和静态方法(static)。

1.2 接口的实现

  • 通过implements关键字实现接口。
  • 实现类必须重写接口中所有抽象方法(除非是抽象类)。
  • 一个类可实现多个接口(多继承的替代方案)。
interface Flyable {
    void fly();
}

class Bird implements Flyable {
    @Override
    public void fly() {
        System.out.println("Bird is flying");
    }
}

2. 抽象类(Abstract Class)

2.1 抽象类的定义与特性

  • 定义:抽象类是用abstract修饰的类,可以包含抽象方法和具体实现。
  • 特性:
    • 不能直接实例化。
    • 可以包含构造方法(用于子类初始化)。
    • 可以定义成员变量和具体方法。
    • 子类必须重写所有抽象方法(除非子类也是抽象类)。
abstract class Animal {
    abstract void makeSound();
    
    void sleep() {
        System.out.println("Animal is sleeping");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark!");
    }
}

3. 接口与抽象类的对比

特性接口抽象类
关键字interfaceabstract class
方法实现默认无实现(Java 8支持默认方法)可包含具体方法和抽象方法
多继承支持(一个类可实现多个接口)不支持(单继承)
成员变量只能是常量可以是普通变量
设计目的定义行为规范提供代码复用和部分实现

4. 应用场景

4.1 何时使用接口?

  • 需要定义一组不相关的类的共同行为。
  • 需要实现多继承功能。
  • 例如:Comparable(排序)、Runnable(多线程)。

4.2 何时使用抽象类?

  • 需要为子类提供通用代码实现。
  • 需要定义模板方法模式。
  • 例如:InputStream(定义部分IO操作)。

5. Java 8及以后的增强

  • 默认方法:允许接口提供默认实现,避免破坏现有代码。
    interface Vehicle {
        default void start() {
            System.out.println("Vehicle started");
        }
    }
    
  • 静态方法:接口中可直接定义静态工具方法。

6. 最佳实践

  1. 优先使用接口:保持灵活性,避免继承的局限性。
  2. 抽象类用于代码复用:当多个子类有共享逻辑时。
  3. 避免过度设计:仅在必要时使用抽象类或接口。

思考题:

  1. 为什么Java不支持多继承但允许实现多个接口?
  2. 如何设计一个既需要模板方法又需要多继承的场景?
Last Updated:: 3/27/25, 12:48 PM