深入浅出:Java 抽象类与接口

前言

Java 是一种面向对象的编程语言,其中 抽象类接口 是实现多态和设计模式中的重要工具。它们在编程中具有重要的地位,能够有效提高代码的灵活性和可维护性。尽管它们有一些相似之处,但在语法和应用场景上存在许多不同点。本博客将深入探讨 抽象类接口。

一、什么是抽象类(Abstract Class)?

1. 抽象类的定义

抽象类是一个不能被实例化的类。它被用来作为其他类的基类,以提供一些通用的功能和属性,子类可以继承并实现其中的抽象方法。抽象类可以包含:

  • 抽象方法:没有实现的方法,需要在子类中实现。
  • 非抽象方法:已经实现的方法,子类可以直接继承或重写。
  • 成员变量:用于存储数据的字段,可以有默认值。
  • 构造函数:可以用于初始化抽象类中的成员变量。

 2. 抽象类的语法

abstract class Animal {
    String name;
    
    // 抽象方法,没有实现
    abstract void sound();

    // 非抽象方法,有实现
    void sleep() {
        System.out.println(name + " is sleeping");
    }
}

在这个例子中,Animal 类是一个抽象类,sound 是抽象方法,sleep 是普通方法。sound 方法没有具体实现,sleep 方法有具体的实现。

3. 抽象类的特点

  • 抽象类不能实例化:不能直接创建抽象类的对象,只能创建其子类的对象。
  • 可以包含抽象方法和普通方法:抽象类允许包含未实现的抽象方法,也可以包含已经实现的方法。
  • 可以有构造函数:虽然不能实例化,但抽象类仍然可以有构造函数,用于初始化其成员变量。
  • 可以有成员变量:和普通类一样,抽象类也可以有成员变量(字段)。

二、什么是接口(Interface)?

1. 接口的定义

接口是一种特殊的抽象类,它用于定义类应该遵循的行为(方法签名)。接口只包含常量和抽象方法的声明,不包含任何实现。一个类实现接口后,必须提供接口中所有方法的具体实现。接口常用于定义一些公共行为,不关心具体的实现方式。

2. 接口的语法

interface Animal {
    // 所有方法默认是 public abstract
    void sound();
    
    // 不能有构造函数
    // 不能有成员变量,只有常量(public static final)
    int LEGS = 4;  // 默认 public static final
}

在这个例子中,Animal 是一个接口,包含一个 sound 方法和一个常量 LEGS。所有的接口方法默认是 publicabstract,而常量是 public static final

3. 接口的特点

  • 接口不能实例化:接口不能直接创建对象,只能通过实现接口的类来创建对象。
  • 所有方法默认是抽象的:接口中的所有方法默认是抽象的,无需使用 abstract 关键字(Java 8 之后,接口中可以有默认方法)。
  • 只能有常量,不能有成员变量:接口中的变量默认是 public static final,即常量,不能像抽象类一样有实例变量。
  • 可以有默认方法和静态方法:Java 8 引入了默认方法(default)和静态方法(static)的概念,允许在接口中定义方法的实现。

三、抽象类与接口的主要区别

特性抽象类接口
能否被实例化不能实例化不能实例化
方法定义可以有抽象方法和普通方法所有方法默认是抽象的(Java 8 后可有默认方法)
构造函数可以有构造函数不能有构造函数
成员变量可以有实例变量和常量只能有常量
继承/实现类只能继承一个抽象类(单继承)类可以实现多个接口(多实现)
访问修饰符可以有多种访问修饰符(publicprotectedprivate默认是 public,不能指定其他访问修饰符
用途用于共享代码和提供默认实现用于定义行为,规范实现类的行为

四、什么时候使用抽象类,什么时候使用接口?

1. 使用抽象类的场景

  • 有共同的行为:如果多个类有相同的方法或字段,且这些方法或字段的实现基本相同,可以通过抽象类来提取共同的部分。
  • 共享代码:当你希望多个类共享代码时,可以将这些代码放在抽象类中,子类通过继承来复用这些代码。
  • 不需要多个继承:由于 Java 不支持多重继承,使用抽象类时如果有多个相似功能的类,最好将这些功能合并到一个类中。

2. 使用接口的场景

  • 类之间需要共享行为而不是实现:接口用于提供类的行为规范,而不涉及具体实现。多个不相关的类可以实现同一个接口。
  • 类实现多个接口:Java 支持多重实现,一个类可以实现多个接口。此时接口提供了灵活的多态性设计。
  • 需要多种功能的组合:当你希望一个类可以“混入”多种功能时,接口提供了一个解决方案。

五、Java 8 新特性:默认方法和静态方法

Java 8 引入了接口的两个新特性:默认方法静态方法

1. 默认方法(Default Method)

默认方法允许接口在不影响实现类的情况下为接口添加方法实现。这为接口添加新功能提供了便利,而不需要修改所有实现类。

interface Animal {
    void sound();  // 抽象方法

    // 默认方法
    default void eat() {
        System.out.println("This animal eats food.");
    }
}

2. 静态方法(Static Method)

接口中的静态方法可以像普通类的静态方法一样被调用,而不需要实现类来实现它。

interface Animal {
    static void info() {
        System.out.println("This is an Animal interface.");
    }
}

六、结论

Java 中的 抽象类接口 是面向对象设计中非常重要的两种工具。它们通过不同的方式帮助我们实现代码复用、模块化设计和多态。选择使用抽象类还是接口取决于应用场景和设计需求:

  • 抽象类 更适合用于共享代码和实现公共行为。
  • 接口 更适合定义规范和行为,支持多实现。

附:代码示例

以下是一个使用抽象类和接口的代码示例:

abstract class Animal {
    abstract void sound();
    
    void sleep() {
        System.out.println("Animal is sleeping.");
    }
}

interface Swimmable {
    void swim();
}

class Fish extends Animal implements Swimmable {
    @Override
    void sound() {
        System.out.println("Fish makes no sound.");
    }

    @Override
    public void swim() {
        System.out.println("Fish swims in water.");
    }
}

public class Main {
    public static void main(String[] args) {
        Fish fish = new Fish();
        fish.sound();
        fish.sleep();
        fish.swim();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/947677.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springcloud篇3-docker需熟练掌握的知识点

docker的原理请参考博文《Docker与Kubernetes》。 一、安装docker的指令 1.1 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken补充:配置镜像源 注意: yum安装是在线联网下载安装,而很多的资源…

ceph文件系统

ceph文件系统:高度可扩展,分布式的存储文件系统,旨在提高性能,高可靠性和高可用的对 象存储,块存储,文件系统的存储。使用分布式的算法保证数据的高可用和一致性。 ceph的组件 1、MON:ceph m…

牛客网刷题 ——C语言初阶——BC117 小乐乐走台阶

1.题目 :BC117 小乐乐走台阶 牛客OJ题链接 描述 小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法? 输入描述: 输入包含一个整数n (1 ≤ n ≤ 30) …

flux文生图 生成高质量图像

flux文生图 生成高质量图像 flyfish import torch from diffusers import FluxPipeline# 初始化 FluxPipeline model_path "/home/FLUX___1-dev" pipe FluxPipeline.from_pretrained(model_path, torch_dtypetorch.bfloat16) pipe.enable_model_cpu_offload() #…

设计模式 结构型 装饰器模式(Decorator Pattern)与 常见技术框架应用 解析

装饰器模式(Decorator Pattern),又称为包装器模式(Wrapper Pattern),是一种结构型设计模式。它允许在不改变原有对象结构的基础上,动态地给对象添加一些新的职责(即增加其额外功能&a…

计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫

2021年12月21日 姓名 专业 软件工程 班级 20-IBM-企Java2 题目 基于hadoopSpark的游戏推荐与可视化系统的设计与实现 指导教师 王文钧、王春娴 一、与本题目有关的国内外研究情况、题目研究的目的和意义、主要内容、本课题创新之处、拟解决的问题: 国内外…

[创业之路-222]:波士顿矩阵与GE矩阵在业务组合选中作用、优缺点比较

目录 一、波士顿矩阵 1、基本原理 2、各象限产品的定义及战略对策 3、应用 4、优点与局限性 二、技术成熟度模型与产品生命周期模型的配对 1、技术成熟度模型 2、产品生命周期模型 3、技术成熟度模型与产品生命周期模型的配对 三、产品生命周期与产品类型的对应关系 …

使用Python类库pandas操作Excel表格

Date: 2025.01.02 20:33:30 author: lijianzhan 简述:pandas 是处理 Excel 文件的强大工具,它提供了简单易用的接口来读取、操作和写入 Excel 数据。以下是使用 pandas 处理 Excel 文件的详细指南,包括常见操作和示例代码。 安装依赖,pandas …

Deepseek v3 的笔记

基本概述 Deepseek v3是Deepseek发布的旗舰模型,属于607B的混合专家(MoE)模型,其中活跃参数为37B。在当前的模型领域,它堪称最佳的开源模型,性能超越了Llama 3.1 405b、Qwen和Mistral等知名模型。根据基准…

Python多分类Logistic回归详解与实践

在机器学习中,Logistic回归是一种基本但非常有效的分类算法。它不仅可以用于二分类问题,还可以扩展应用于多分类问题。本文将详细介绍如何使用Python实现一个多分类的Logistic回归模型,并给出详细的代码示例。 一、Logistic回归简介 Logist…

前端,npm install安装依赖卡在sill idealTree buildDeps(设置淘宝依赖)

输入npm i后,一直卡在sill idealTree buildDeps,一动不动 cnpm可以安装成功,但使用cnpm不会生成package-lock.json文件 设置淘宝依赖,依然卡住,挂梯子也不行 解决方法: // 取消ssl验证 set strict-ssl …

装饰者模式

1、定义 装饰者模式:在不必改变原类和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象 2、实际应用 星巴克的咖啡系统项目: 星巴克要求的各种下单功能:大杯原味、大…

招银网路Java后端一面,难度有点大!

这是一位武汉理工大学同学的招银网络一面面经,同样附带超详细的参考答案。大家可以用来查漏补缺,针对性地补短板。 招银网络一面还是比较简单的,基本都是一些比较重要且高频的常规八股,项目问的不多。到了二面的时候, 会开始主要考察你的项目。 1、自我介绍 自我介绍一般…

C++之设计模式

设计模式 简介单例模式饿汉模式懒汉模式 工厂模式简单工厂模式工厂方法模式抽象工厂模式 建造者模式代理模式 简介 设计模式是前辈们对代码开发经验的总结,是解决特定问题的⼀系列套路它不是语法规定,而是⼀套⽤来提高代码可复用性、可维护性、可读性、…

云效流水线使用Node构建部署前端web项目

云效流水线实现自动化部署 背景新建流水线配置流水线运行流水线总结 背景 先来看看没有配置云效流水线之前的部署流程: 而且宝塔会经常要求重新登录,麻烦的很 网上博客分享了不少的配置流程,这一篇博客的亮点就是不仅给出了npm命令构建&…

pycharm如何拉取一个git项目,然后,修改后再上传到自建的项目中?

以chattts为例 https://github.com/2noise/ChatTTS.git 1.建一个虚拟环境,用于项目使用 2.pycharm新建工程 3.忽略 提示 勾选,新建远程仓库 设置账号和密码 设置git路径,一般是正确的,点测试即可 &…

(五)开机自启动以及scp工具文件传输小问题

文章目录 程序开机自启动先制作一个可执行程序第一种 通过命令行实现程序开机自启动第二种 通过 Linux 系统镜像实现程序开机自启动 scp工具文件传输小问题 程序开机自启动 原因:做成产品后,用户直接开机使用,总不能在开机执行程序后才可以使…

供需平台信息发布付费查看小程序系统开发方案

供需平台信息发布付费查看小程序系统主要是为了满足个人及企业用户的供需信息发布与匹配需求。 一、目标用户群体 个人用户:寻找兼职工作、二手物品交换、本地服务(如家政、维修)等。 小微企业:推广产品和服务,寻找合…

中建海龙:科技助力福城南产业片区绿色建筑发展

在快速发展的城市化进程中,绿色建筑以其环保、节能、可持续的特点日益受到重视。作为建筑工业化领域的领军企业,中建海龙科技有限公司(简称“中建海龙”)凭借其卓越的科技实力和创新举措,在推动绿色建筑发展方面做出了…

OJ随机链表的复制题目分析

题目内容: 138. 随机链表的复制 - 力扣(LeetCode) 分析: 这道题目,第一眼感觉非常乱,这是正常的,但是我们经过仔细分析示例明白后,其实也并不是那么难。现在让我们一起来分析分析…