接口 vs 抽象类:谁是更好的工具?了解它们的区别和使用场景

Java中的接口抽象类,就像工具箱里的两种不同工具,它们各有用途,关键是你得知道什么时候该用哪一个。虽然它们都可以用来定义“规范”或“模板”,但使用场景和功能上有一些关键区别。


接口与抽象类的主要区别
  1. 定义和实现的不同

    • 接口是一个完全抽象的概念,它只定义了方法的“外壳”(方法名),没有任何实现(除非是默认方法)。所有方法都必须由实现它的类来具体定义。
    • 抽象类则是一个“半成品”,它可以有一些已经写好的方法,也可以有一些抽象方法(只定义了方法名,没有具体实现)。
  2. 继承与实现的灵活性

    • 接口是为了实现多重继承而设计的。一个类可以实现多个接口,意味着可以组合多个能力。
    • 抽象类只能被单继承,一个子类只能继承一个抽象类,不能继承多个。
  3. 使用的目的

    • 接口的目的是让不相关的类可以通过实现相同的接口具备相似的功能。它强调的是行为,比如让一个类可以“飞”(实现Flyable接口)或者“游泳”(实现Swimmable接口),而不关心它是什么类型的对象。
    • 抽象类的目的是为相关的类提供共同的基础。它适合用来定义一组相似的类,共享一些通用功能,比如Animal类可以为所有动物提供通用的行为(睡觉、呼吸),但具体的动物发声方式则由子类去实现。
  4. 成员的定义

    • 接口中除了抽象方法,只能定义常量static final),不能有实例变量。
    • 抽象类可以包含实例变量已实现的方法构造方法

什么时候用接口?
  1. 多重继承的需求:如果你需要让一个类同时拥有多个能力,比如“会飞”和“会游泳”,那么接口是最佳选择。Java不支持多继承,但接口允许你组合不同的能力。

    例子:让某个类既可以飞又可以游泳。

    interface Flyable {
        void fly();
    }
    
    interface Swimmable {
        void swim();
    }
    
    class Bird implements Flyable, Swimmable {
        @Override
        public void fly() {
            System.out.println("鸟在飞翔");
        }
    
        @Override
        public void swim() {
            System.out.println("鸟也会游泳");
        }
    }
    
  2. 不同类之间的通用功能:如果你想让完全不同的类拥有相同的行为,而不想让它们之间有太多耦合,比如让猫和飞机都能“飞”,就可以用接口来定义这种通用行为。


什么时候用抽象类?
  1. 定义通用的基础类:当多个类之间有相似的结构或功能时,抽象类是更好的选择。抽象类可以定义一些通用的逻辑,让子类继承这些功能,同时允许子类实现一些具体的特定行为。

    例子:定义一个动物的抽象类。

    abstract class Animal {
        void sleep() {
            System.out.println("动物在睡觉");
        }
    
        abstract void makeSound();
    }
    
    class Dog extends Animal {
        @Override
        void makeSound() {
            System.out.println("狗在汪汪叫");
        }
    }
    
  2. 共享代码:抽象类允许你在父类中实现一些方法,避免重复代码。所有子类都可以直接继承这些方法,不需要自己重复实现。


如何选择?
  • 如果你的类有很多通用功能,并且需要共享一些已实现的方法,使用抽象类
  • 如果你想让不同的类实现相同的行为或能力,而这些类本身不需要有太多共同点,使用接口

总结:接口和抽象类各有千秋
  • 接口更像是功能模块,可以赋予类额外的能力。
  • 抽象类更像是骨架,提供通用的基础和结构。

掌握这两者的使用场景,你就能写出更灵活、可扩展的代码,在不同的编程需求下游刃有余。

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

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

相关文章

leetcode_128:最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums [100,4,200,1,3,2] 输出:4 解…

CSS揭秘:7. 伪随机背景

前置知识:CSS 渐变,5. 条纹背景,6. 复杂的背景图案 前言 本篇主要内容依然是关于背景的,无限平铺的背景会显得整齐美观,但又有些呆板,如何实现背景的多样性和随机性,是本篇的核心。 一、四种颜…

AI周报(10.20-10.26)

AI应用-牙科AI产品Pearl Pearl是一家致力于改善牙科患者护理的人工智能驱动型公司,推出了首款获得美国食品药品监督管理局(FDA)批准的人工智能,能够读取牙科X光片并即时识别疾病。今年7月获得5800万美元的B轮融资,以加…

GESP一级真题分析-202303-选择题1-输入输出设备、存储单位、默认数据类型、标识符命名

PDF文档回复:20241026 1 相关知识点 1) 输入输出设备 输入设备 是外界向计算机传送信息的装置。在微型计算机系统中,最常用的输入设备是键盘和鼠标。 此外还有电子光笔、数字化仪、图形扫描仪、触摸屏、麦克风、视频输入设备、条形码扫描等 输出设备 作用是将计…

Java-图书管理系统

我的个人主页 欢迎来到我的Java图书管理系统,接下来让我们一同探索如何书写图书管理系统吧! 1管理端和用户端 2建立相关的三个包(book、operation、user) 3建立程序入口Main类 4程序运行 1.首先图书馆管理系统分为管理员端和…

6.stm32 OLED显示屏

调试方式 串口调试:通过串口通信,将调试信息发送到电脑端,电脑使用串口助手显示调试信息 显示屏调试:直接将显示屏连接到单片机,将调试信息打印在显示屏上 Keil调试模式:借助Keil软件的调试模式&#…

【阅读笔记】Instruction-based Hypergraph Pretraining

Abstract中可以提炼的信息: 背景:预训练的作用是为了增强图学习模型将知识从大数据集转移到下游任务的适应性。 想解决的问题:训练目标的不同与数据分布的不同会阻碍预训练知识的迁移。 文章受到基于指令的提示词在语言模型训练广泛应用的启发…

Vue学习笔记(四)

事件处理 我们可以使用 v-on 指令 (通常缩写为 符号) 来监听 DOM 事件,并在触发事件时执行一些 JavaScript。用法为 v-on:click"methodName" 或使用快捷方式 click"methodName" 事件处理器的值可以是: 内联事件处理器&#xff1…

鹅厂面试官:Transformer 为何需要位置编码?

最近这一两周看到不少互联网公司都已经开始秋招发放Offer。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球…

前端零基础入门到上班:【Day2】开发环境VSCode安装

VSCode 安装教程:图文保姆教程 引言 在前端开发中,选择合适的代码编辑器是提高工作效率的重要一步。Visual Studio Code(简称 VSCode)作为一款强大的开源编辑器,因其简洁易用、功能强大、扩展性好而广受开发者喜爱。…

【智能大数据分析 | 实验四】Spark实验:Spark Streaming

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘,以提取有价值的信息和洞察。它结合了大数据技术、人工智能(AI)、机器学习(ML&a…

Postman常见问题及解决方(全)

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、网络连接问题 如果Postman无法发送请求或接收响应,可以尝试以下操作: 检查网络连接是否正常,包括检查网络设置、代理设置…

前端零基础入门到上班:【Day3】从零开始构建网页骨架HTML

HTML 基础入门&#xff1a;从零开始构建网页骨架 目录 1. 什么是 HTML&#xff1f;HTML 的核心作用 2. HTML 基本结构2.1 DOCTYPE 声明2.2 <html> 标签2.3 <head> 标签2.4 <body> 标签 3. HTML 常用标签详解3.1 标题标签3.2 段落和文本标签3.3 链接标签3.4 图…

市面上热门的四款PDF转换器解析!!

在互联网普及的今天&#xff0c;PDF和Excel已经成为我们工作中不可或缺的两种文件格式。PDF常用于文档的阅读、打印和分享&#xff0c;而Excel则适用于数据的分析和处理。但是&#xff0c;有时候我们需要在两者之间进行转换&#xff0c;例如将PDF中的数据导入到Excel中进行进一…

物联网数据采集网关详细介绍-天拓四方

一、物联网数据采集网关的概述 物联网数据采集网关&#xff0c;简称数据采集网关&#xff0c;是物联网系统中的重要组成部分&#xff0c;位于物联网设备和云端平台之间。其主要职责是实现数据的采集、汇聚、转换、传输等功能&#xff0c;确保来自不同物联网设备的数据能够统一…

Hadoop 踩坑汇总

文章目录 一、完整教程二、解决问题问题①&#xff1a; DataNode 没有问题②&#xff1a; 网页打不开 三、大功告成&#xff01;&#xff01; 一、完整教程 这个教程比较详细&#xff0c;博主是按照这个来执行的 https://blog.csdn.net/qq_47831505/article/details/123806514…

VsCode插件:前端每日一题

Javascript本地存储的方式有哪些&#xff1f; 区别及应用场景? 1. Cookie Cookie 是网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据。Cookie 通常包含了用户的一些个人信息&#xff0c;如用户名、密码、浏览记录、偏好设置等。Cookie 一般在用户访问网站…

Excel:vba实现生成随机数

Sub 生成随机数字()Dim randomNumber As IntegerDim minValue As IntegerDim maxValue As Integer 设置随机数的范围(假入班级里面有43个学生&#xff0c;学号是从1→43)minValue 1maxValue 43 生成随机数(在1到43之间生成随机数)randomNumber Application.WorksheetFunctio…

智联招聘×Milvus:向量召回技术提升招聘匹配效率

01. 业务背景 在智联招聘平台&#xff0c;求职者和招聘者之间的高效匹配至关重要。招聘者可以发布职位寻找合适的人才&#xff0c;求职者则通过上传简历寻找合适的工作。在这种复杂的场景中&#xff0c;我们的核心目标是为双方提供精准的匹配结果。在搜索推荐场景下&#xff0c…

深入理解gPTP时间同步过程

泛化精确时间协议(gPTP)是一个用于实现精确时间同步的协议,特别适用于分布式系统中需要高度协调的操作,比如汽车电子、工业自动化等。 gPTP通过同步主节点(Time Master)和从节点(Time Slave)的时钟,实现全局一致的时间参考。 以下是gPTP实现主从时间同步的详细过程:…