Java中的接口与抽象类:区别与联系

news2025/1/21 15:40:46

Java中的接口与抽象类:区别与联系

在Java中,interface(接口)和abstract class(抽象类)是两种重要的抽象类型,用于定义对象的抽象行为和结构。虽然Java 8之后接口引入了默认方法和静态方法,使得接口功能更加强大,但它们之间仍然存在显著的区别。本文将详细探讨两者的区别及其各自的用途。

1. 抽象程度和目的

  • 接口 (interface): 用于定义一组方法,这些方法是任何实现接口的类必须要实现的。接口关注的是行为规范。
  • 抽象类 (abstract class): 用于定义一组抽象方法(不带实现)和具体方法(带实现),以及成员变量。抽象类既可以提供部分实现,也可以定义强制子类实现的方法。抽象类关注的是对象的状态和行为。

2. 方法实现

  • 接口: 接口中的所有方法默认是抽象的(Java 8之前),不能有方法实现。Java 8开始,接口可以包含默认方法(带有默认实现)和静态方法。
  • 抽象类: 抽象类可以包含抽象方法(没有实现)和具体方法(有实现)。

3. 多重继承

  • 接口: 一个类可以实现多个接口。这种特性使得接口成为实现多重继承的方式。
  • 抽象类: 一个类只能继承一个抽象类。Java不支持多重继承,但允许单继承。

4. 成员变量

  • 接口: 接口中的成员变量默认是 public static final,即常量,必须在声明时初始化。
  • 抽象类: 抽象类可以包含各种访问级别的成员变量(privateprotectedpublic),且这些变量可以是非静态的,可以在构造器中初始化。

5. 访问修饰符

  • 接口: 接口的方法默认是 public,不能包含其他访问级别的方法。
  • 抽象类: 抽象类的方法可以有不同的访问修饰符(privateprotectedpublic)。

6. 构造器

  • 接口: 接口不能有构造器,因为接口不能被实例化。
  • 抽象类: 抽象类可以有构造器,但不能直接实例化。构造器通常用于子类调用,以初始化抽象类的成员变量。

7. 实现和继承的关键字

  • 接口: 使用 implements 关键字来实现接口。
  • 抽象类: 使用 extends 关键字来继承抽象类。

示例代码

接口示例:

public interface Animal {
    void eat();
    void sleep();

    default void breathe() {
        System.out.println("Animal is breathing");
    }

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

抽象类示例:

public abstract class Dog {
    private String name;

    public Dog(String name) {
        this.name = name;
    }

    public void sleep() {
        System.out.println(name + " is sleeping");
    }

    public abstract void bark();

    public void breathe() {
        System.out.println(name + " is breathing");
    }
}

子类实现:

public class Labrador extends Dog {
    public Labrador(String name) {
        super(name);
    }

    @Override
    public void bark() {
        System.out.println("Labrador is barking");
    }
}

主要区别

尽管接口在Java 8之后得到了增强,但接口和抽象类之间仍然存在以下重要区别:

1. 成员变量

  • 接口: 成员变量默认是 public static final 常量,必须在声明时初始化。
  • 抽象类: 可以包含各种访问级别的成员变量(privateprotectedpublic),可以是非静态的,也可以在构造器中初始化。

2. 构造器

  • 接口: 接口不能有构造器,不能被实例化。
  • 抽象类: 抽象类可以有构造器,构造器用于子类调用,以初始化抽象类的成员变量。

3. 多重继承

  • 接口: 一个类可以实现多个接口,提供多重继承的效果。
  • 抽象类: 一个类只能继承一个抽象类,Java 不支持多重继承。

4. 继承和实现的语义

  • 接口: 强调的是行为规范,定义了一组必须实现的方法。
  • 抽象类: 强调的是代码重用和对象状态,可以包含成员变量和部分实现。

5. 设计理念和使用场景

  • 接口: 适用于定义某种行为的契约,强调行为的统一性。适合用来定义能力、服务或角色。
  • 抽象类: 适用于需要共享代码的场景,强调代码的重用性和对象的层次结构。适合用来定义具体类的基类。

使用建议

  1. 使用接口:

    • 当需要定义多个不相关的类可以实现的行为时。
    • 当需要通过多重继承来扩展类的功能时。
    • 当希望实现某种角色或能力的多态性时。
  2. 使用抽象类:

    • 当需要为子类提供一个默认的行为实现时。
    • 当需要在抽象类中定义公共的成员变量和方法时。
    • 当需要利用构造器来初始化一些公共状态时。

Java中的接口与抽象类:区别与联系

在Java中,interface(接口)和abstract class(抽象类)是两种重要的抽象类型,用于定义对象的抽象行为和结构。虽然Java 8之后接口引入了默认方法和静态方法,使得接口功能更加强大,但它们之间仍然存在显著的区别。本文将详细探讨两者的区别及其各自的用途。

1. 抽象程度和目的
  • 接口 (interface): 用于定义一组方法,这些方法是任何实现接口的类必须要实现的。接口关注的是行为规范。
  • 抽象类 (abstract class): 用于定义一组抽象方法(不带实现)和具体方法(带实现),以及成员变量。抽象类既可以提供部分实现,也可以定义强制子类实现的方法。抽象类关注的是对象的状态和行为。
2. 方法实现
  • 接口: 接口中的所有方法默认是抽象的(Java 8之前),不能有方法实现。Java 8开始,接口可以包含默认方法(带有默认实现)和静态方法。
  • 抽象类: 抽象类可以包含抽象方法(没有实现)和具体方法(有实现)。
3. 多重继承
  • 接口: 一个类可以实现多个接口。这种特性使得接口成为实现多重继承的方式。
  • 抽象类: 一个类只能继承一个抽象类。Java不支持多重继承,但允许单继承。
4. 成员变量
  • 接口: 接口中的成员变量默认是 public static final,即常量,必须在声明时初始化。
  • 抽象类: 抽象类可以包含各种访问级别的成员变量(privateprotectedpublic),且这些变量可以是非静态的,可以在构造器中初始化。
5. 访问修饰符
  • 接口: 接口的方法默认是 public,不能包含其他访问级别的方法。
  • 抽象类: 抽象类的方法可以有不同的访问修饰符(privateprotectedpublic)。
6. 构造器
  • 接口: 接口不能有构造器,因为接口不能被实例化。
  • 抽象类: 抽象类可以有构造器,但不能直接实例化。构造器通常用于子类调用,以初始化抽象类的成员变量。
7. 实现和继承的关键字
  • 接口: 使用 implements 关键字来实现接口。
  • 抽象类: 使用 extends 关键字来继承抽象类。
示例代码

接口示例:

public interface Animal {
    void eat();
    void sleep();

    default void breathe() {
        System.out.println("Animal is breathing");
    }

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

抽象类示例:

public abstract class Dog {
    private String name;

    public Dog(String name) {
        this.name = name;
    }

    public void sleep() {
        System.out.println(name + " is sleeping");
    }

    public abstract void bark();

    public void breathe() {
        System.out.println(name + " is breathing");
    }
}

子类实现:

public class Labrador extends Dog {
    public Labrador(String name) {
        super(name);
    }

    @Override
    public void bark() {
        System.out.println("Labrador is barking");
    }
}
主要区别

尽管接口在Java 8之后得到了增强,但接口和抽象类之间仍然存在以下重要区别:

1. 成员变量

  • 接口: 成员变量默认是 public static final 常量,必须在声明时初始化。
  • 抽象类: 可以包含各种访问级别的成员变量(privateprotectedpublic),可以是非静态的,也可以在构造器中初始化。

2. 构造器

  • 接口: 接口不能有构造器,不能被实例化。
  • 抽象类: 抽象类可以有构造器,构造器用于子类调用,以初始化抽象类的成员变量。

3. 多重继承

  • 接口: 一个类可以实现多个接口,提供多重继承的效果。
  • 抽象类: 一个类只能继承一个抽象类,Java 不支持多重继承。

4. 继承和实现的语义

  • 接口: 强调的是行为规范,定义了一组必须实现的方法。
  • 抽象类: 强调的是代码重用和对象状态,可以包含成员变量和部分实现。

5. 设计理念和使用场景

  • 接口: 适用于定义某种行为的契约,强调行为的统一性。适合用来定义能力、服务或角色。
  • 抽象类: 适用于需要共享代码的场景,强调代码的重用性和对象的层次结构。适合用来定义具体类的基类。

使用建议

  1. 使用接口:

    • 当需要定义多个不相关的类可以实现的行为时。
    • 当需要通过多重继承来扩展类的功能时。
    • 当希望实现某种角色或能力的多态性时。
  2. 使用抽象类:

    • 当需要为子类提供一个默认的行为实现时。
    • 当需要在抽象类中定义公共的成员变量和方法时。
    • 当需要利用构造器来初始化一些公共状态时。

参考链接

  1. Java Documentation - Interfaces
  2. Java Documentation - Abstract Classes
  3. Java 8 Features - Default Methods
  4. Java 8 Features - Static Methods in Interfaces

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MYSQL数据库客户端常规指令使用

这里新开一章,对MYSQL进行更加底层的系统的一个学习 Mysql常用工具简介 emmmm这里的话就默认大家在linux系统上面都进行了MYSQL的安装了. 在mysql安装完成之后,一般在路径 /usr/bin 下的 我们对该路径进行一个文件的展示 这里是展示出来的辅助工具 …

ucharts自定义添加tooltip悬浮框显示项内容且换行

欢迎点击领取 -《前端开发面试题进阶秘籍》:前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的🪜 一、需求描述分析 1、小程序上实现图表的绘制,多条线路,不同颜色,悬浮框对应内容不同数据进行处理 2…

Windows10设置通过.net3.5访问HP DL585G7服务器iLO的控制台

HP DL585G7服务器设备较老了,本文记录如何通过.net3.5访问其iLO管理口的控制台,同类HP服务器可参考进行。 一、调试电脑版本 二、调试电脑安装.net3.5 请参考本人文档:Windows10 22H2用系统安装光盘安装.net3.5 三、Edge启用IE模式 请参考…

Python 全栈体系【四阶】(五十六)

第五章 深度学习 十三、自然语言处理(NLP) 2. 传统NLP处理技术 2.1 中文分词 中文分词是一项重要的基本任务,分词直接影响对文本语义的理解。分词主要有基于规则的分词、基于统计的分词和混合分词。基于规则的分词主要是通过维护词典&…

FreeRTOS学习笔记-基于stm32(7)任务状态查询与任务时间统计API函数

1、FreeRTOS任务相关API函数 函数描述uxTaskPriorityGet()查询某个任务的优先级vTaskPrioritySet()改变某个任务的任务优先级uxTaskGetSystemState()获取系统中任务状态vTaskGetInfo()获取某个任务信息xTaskGetApplicationTaskTag()获取某个任务的标签(Tag)值xTaskGetCurrentT…

Ktor库的高级用法:代理服务器与JSON处理

在现代网络编程中,Ktor是一个高性能且易于使用的框架,它提供了对异步编程、WebSockets、HTTP客户端和服务器等特性的原生支持。Ktor是使用Kotlin语言编写的,充分利用了Kotlin的协程特性来简化异步编程。本文将深入探讨Ktor库的高级用法&#…

数据误删?别怕!COS防误删和误删恢复攻略请查收

在云存储领域,数据的安全性始终是悬在头顶的达摩克利斯之剑。长期以来,腾讯云对象存储服务(COS)一直致力于数据安全的探索和实践,以保障数据的安全性和完整性。对象存储COS准备了一份“防误删”和“误删恢复”攻略给大…

Base64前端图片乱码转换

title: Base64码乱转换 date: 2024-06-01 20:30:28 tags: vue3 后端图片前端显示乱码 现象 后端传来一个图片,前端能够接收,但是console.log()后发现图片变成了乱码,但是检查后台又发现能够正常的收到了这张图片。 处理方法 笔者有尝试将…

SQL注入之updatexml报错注入(函数解释)

先解释一下updatexml参数的用法 updatexml():更新xml文档的函数 语法:updatexml(目标xml文档,xml路径,更新的内容) 第二个参数 xml路径 是可操作的地方,xml文档中路径是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他…

OceanBase 内存研究(OceanBase 3.2.4.5)

内存结构 从官网的结构图可以看出,一台observer可使用的总内存(memory_limit)包括 系统内存(system_memory) 和 租户内存(sys租户与普通租户) 系统内存 系统内存system_memory 属于 observer 的内部内存,允许其它租户共享使用该内存资源 (root10.0.0.…

Java集合简略记录

一、集合体系结构 单列集合:Collection 双列集合:Map 二、单列集合 List系列集合:添加的元素是有序、可重复、有索引 有序指的是存和取的顺序是一致的,和之前排序的从小到大是没有任何关系的 Set系列集合:添加的元素是…

RandLA-Net 训练自定义数据集

https://arxiv.org/abs/1911.11236 搭建训练环境 git clone https://github.com/QingyongHu/RandLA-Net.git搭建 python 环境 , 这里我用的 3.9conda create -n randlanet python3.9 source activate randlanet pip install tensorflow2.15.0 -i https://pypi.tuna.tsinghua.e…

从CSV到数据库(简易)

需求:客户上传CSV文档,要求CSV文档内容查重/插入/更新相关数据。 框架:jdbcTemplate、commons-io、 DB:oracle 相关依赖: 这里本来打算用的2.11.0,无奈正式项目那边用老版本1.3.1,新版本对类型…

eNSP学习——RIP路由协议基础配置

目录 主要命令 原理概述 实验内容 实验目的 实验拓扑 实验编址 实验步骤 1、基本配置 2、使用RIPv1搭建网络 开启 RIP调试功能 3、使用RIPv2搭建网络 RIPv1和RIPv2的不同 需要eNSP各种配置命令的点击链接自取:华为eNSP各种设备配置命令大全PD…

使用Python库Matplotlib绘制常用图表类型

使用Python库Matplotlib绘图 一、Matplotlib绘图参数设置1.1 设置分辨率和画布大小1.2 保存图片并设置边缘留白为紧凑型1.3 设置坐标轴标签1.4 画直线设置线宽和颜色1.5 画子图1.5.1 通过figure的add_subplot()画子图1.5.2 通过plt的subplots画子图 二、使用Matplotlib中scatte…

经验分享,超声波车位引导系统和视频车位引导系统有哪些区别

随着城市化进程的加速和汽车保有量的持续增长,停车难已成为城市交通管理的一大挑战。车位引导系统作为解决这一问题的有效工具,其重要性日益凸显。它不仅能够提升停车场的运营效率,还能显著改善驾驶者的停车体验。目前市场上主要有两种车位引…

【Centos7】CentOS 7下的PyTorch安装策略:高效实践指南

【Centos7】CentOS 7下的PyTorch安装策略:高效实践指南 大家好 我是寸铁👊 总结了一篇【Centos7】CentOS 7下的PyTorch安装策略:高效实践指南✨ 喜欢的小伙伴可以点点关注 💝 前言 由于需要跑深度学习,要用到pytorch&a…

全域外卖项目能不能做?可行性分析来了!

作为新的网络热词,全域外卖的传播范围随着时间的推移而不断扩大,从最初的行业内部逐步扩散到多个创业者社区,让许多创业者都有了做全域外卖项目的想法。但是,由于全域外卖赛道刚兴起不久,因此,目前大多数人…

实时监控与报警:人员跌倒检测算法的实践

在全球范围内,跌倒事件对老年人和儿童的健康与安全构成了重大威胁。据统计,跌倒是老年人意外伤害和死亡的主要原因之一。开发人员跌倒检测算法的目的是通过技术手段及时发现和响应跌倒事件,减少因延迟救助而造成的严重后果。这不仅对老年人群…

Mysql(一)查询Sql是如何执行的

Hello,大家好我是极客涛😎,我最近在整理Mysql相关的知识点,所以准备开启一个Mysql的主线任务,大概耗时3周左右,整个节奏还是由浅入深,主要包括Mysql的架构、事务实现、索引组织形式、SQL优化、日…