Java中抽象类和接口的区别,一文弄懂,图文并茂

news2024/11/29 16:35:18

目录

前言

1. 抽象类

1.1 定义

1.2 示例

1.3 使用

1.3.1代码-抽象类

1.3.2代码-抽象类继承类使用

1.3.3输出结果为:

1.4UML类图展示类间的关系

2. 接口

2.1 定义

2.2 示例

2.2.1代码-接口

2.3 使用

2.3.1代码-接口实现

2.3.2代码-接口实现类使用

2.3.3输出结果为:

2.4UML类图展示类间的关系

3. 抽象类和接口的区别

3.1 实现方式

3.2 方法类型

3.3 成员变量

3.4 构造方法

3.5 访问修饰符

4.文字上的对比区别

5.直观的二维表对比

6.抽象类和接口的使用场景

7. 总结


前言

Java是一种面向对象的编程语言,Java中的抽象类和接口是两种常见的抽象概念,它们都能够帮助我们实现抽象化和多态性,但是它们在一些细节上有所不同。本文将详细介绍Java中抽象类和接口的定义、区别和使用,并提供相应的代码示例。

1. 抽象类

1.1 定义

抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类具有类的所有特性,包括成员变量、成员方法、构造方法等,但是其中的某些方法是抽象的,需要在具体的子类中实现。抽象方法没有方法体,只有方法签名,用abstract关键字修饰。

抽象类通常被用来作为其他类的基类,子类必须实现抽象类中定义的所有抽象方法才能被实例化。

抽象类可以包含一些具体的方法和成员变量,这些方法和成员变量在继承的子类中可以直接使用。

1.2 示例

1.2.1代码-抽象类

以下是一个抽象类的示例:

abstract class Animal {
    private String name;
    public Animal(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public abstract void makeSound();
}

在上述代码中,Animal是一个抽象类,其中有一个抽象方法makeSound(),需要在具体的子类中实现。同时,Animal类中还有一个构造方法和两个普通方法。

1.3 使用

1.3.1代码-抽象类

我们可以通过继承抽象类来实现具体的子类,同时需要实现其中的抽象方法。以下是一个继承Animal类的示例:

class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
    @Override
    public void makeSound() {
        System.out.println("汪汪汪");
    }
}

在上述代码中,Dog类继承了Animal类,同时实现了其中的抽象方法makeSound()。我们可以通过创建Dog类的实例来使用它。

1.3.2代码-抽象类继承类使用

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("小狗");
        System.out.println(dog.getName());
        dog.makeSound();
    }
}

1.3.3输出结果为:

小狗

汪汪汪

1.4UML类图展示类间的关系

 

2. 接口

2.1 定义

接口是一种纯抽象的类型,它只包含抽象方法和常量。

接口通常被用来描述一个对象可以做什么,而不是它是什么,准确的来说描述的对象的行为

接口不能被实例化,需要通过实现接口的类来使用。接口中的方法都是抽象的,用abstract关键字修饰。接口中的常量都是public static final类型的,可以直接通过接口名访问。

2.2 示例

以下是一个接口的示例:

2.2.1代码-接口

interface Shape {
    double PI = 3.1415926;
    double getArea();
    double getPerimeter();
}

在上述代码中,Shape是一个接口,其中有两个抽象方法getArea()和getPerimeter(),还有一个常量PI。

2.3 使用

我们可以通过实现接口来使用它。以下是一个实现Shape接口的示例:

2.3.1代码-接口实现

class Circle implements Shape {
    private double radius;
    public Circle(double radius) {
        this.radius = radius;
    }
    @Override
    public double getArea() {
        return PI * radius * radius;
    }
    @Override
    public double getPerimeter() {
        return 2 * PI * radius;
    }
}

在上述代码中,Circle类实现了Shape接口,并实现了其中的两个抽象方法getArea()和getPerimeter()。我们可以通过创建Circle类的实例来使用它。

2.3.2代码-接口实现类使用

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(2);
        System.out.println("面积:" + circle.getArea());
        System.out.println("周长:" + circle.getPerimeter());
    }
}

2.3.3输出结果为:

面积:12.5663704

周长:12.5663704

2.4UML类图展示类间的关系

 

 

3. 抽象类和接口的区别

虽然抽象类和接口都可以实现抽象化和多态性,但是它们在一些细节上有所不同。以下是抽象类和接口的区别:

3.1 实现方式

抽象类是一种特殊的类,需要通过继承它来使用。接口是一种纯抽象的类型,需要通过实现它来使用。

3.2 方法类型

抽象类中的方法可以是抽象的或者非抽象的,而接口中的方法都是抽象的。

3.3 成员变量

抽象类中可以有普通成员变量,也可以有静态成员变量,而接口中只能有常量。

3.4 构造方法

抽象类中可以有构造方法,而接口中不能有构造方法。

3.5 访问修饰符

抽象类中的成员变量和成员方法可以有public、protected、default、private四种访问修饰符,而接口中的成员变量和成员方法只能有public访问修饰符。

4.文字上的对比区别

(1)抽象类可以包含具体的方法和成员变量,而接口不能包含具体的方法和成员变量。

(2)一个类只能继承一个抽象类,而一个类可以实现多个接口。

(3)抽象类的目的是为了作为其他类的基类,而接口的目的是为了描述一个对象可以做什么。

(4)抽象类中的抽象方法必须在子类中实现,而接口中的所有方法都必须在实现类中实现。

(5)抽象类可以有构造方法,而接口不能有构造方法。

(6)抽象类可以拥有非抽象方法,而接口只能拥有抽象方法。

(7)抽象类中的访问修饰符可以是public、protected和default,而接口中的访问修饰符只能是public。

(8)抽象类可以拥有静态方法和静态变量,而接口只能拥有常量。

5.直观的二维表对比

维度抽象类接口
定义一种特殊的类,不能被实例化定义一组方法
方法可以包含普通方法和抽象方法只能包含抽象方法
构造器可以有构造器没有构造器
继承可以被继承可以被实现
多继承不支持多重继承支持多重实现
访问可以有 public、protected、private 访问修饰符只能有 public 访问修饰符
变量可以有实例变量、类变量只能有 public、static 常量

6.抽象类和接口的使用场景

抽象类和接口都有自己的使用场景,下面我们来看一下它们的具体应用:

(1)抽象类通常被用来作为其他类的基类,用来定义一组通用的方法和属性。子类必须实现抽象类中的所有抽象方法才能被实例化。

(2)接口通常被用来描述一个对象可以做什么,而不是它是什么。接口可以被类实现,用来强制实现一组特定的方法。

(3)如果一个类需要实现多个不同的蓝图,那么它应该实现多个接口。

(4)如果一个类需要实现一个通用的蓝图,并且还需要拥有一些具体的方法和属性,那么它应该继承一个抽象类。

7. 总结

本文详细介绍了Java中抽象类和接口的定义、区别和使用,并提供了相应的代码示例。抽象类和接口都是实现抽象化和多态性的重要手段,需要根据实际需求选择使用。同时,需要注意它们在一些细节上的差异,以便正确使用它们。

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

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

相关文章

【Linux】驱动内核调试,没有几板斧,怎么能行?

目录 前言: 一、基础打印工具 (1)printk---最常用 ①Log Buffer: ②Console: ③RAM Console: (2)动态打印 ①动态打印与printk之间的区别联系 ②动态打印常用的例子 ③动态打印转为pri…

C语言实战 - 贪吃蛇(图形界面)

由于本人精力有限,暂时先把素材和代码放上,等以后有空再补教程。 目录 效果预览 准备工作 EasyX图形库 音频素材 代码编写 Transfer.h文件 game.cpp文件 main.c文件 效果预览 先来看一下最终成品效果 贪吃蛇图形界面 准备工作 EasyX图形库 这…

[230513] TPO72 | 2022年托福阅读真题第1/36篇 | 10:45

Invading Algae 目录 Invading Algae 全文 题目 Paragraph 1 P1 段落大意 问题1 Paragraph 2 P2 段落大意 问题2 *问题3* Paragraph 3 P3 段落大意 问题4 Paragraph 4 P4 段落大意 Paragraph 5 P5 段落大意 *问题5* *问题6* 问题7 问题8 问题9…

【计算机组成原理】第二章 运算方法和运算器

系列文章目录 第一章 计算系统概论 第二章 运算方法和运算器 第三章 多层次的存储器 第四章 指令系统 第五章 中央处理器 第六章 总线系统 第七章 外围设备 第八章 输入输出系统 文章目录 系列文章目录第一章 计算系统概论 **第二章 运算方法和运算器** 第三章 多层次的存储器…

C++移动构造函数

一、背景 拷贝构造函数又分为浅拷贝和深拷贝: 浅拷贝:当类中有指针时,直接复制,会使多个指针指向同一块内存,导致重复析构 深拷贝:每次都是重新赋值一份,这种方法内存消耗较大 因此C就提供…

一觉醒来Chat gpt就被淘汰了

目录 什么是Auto GPT? 与其他语言生成模型相比,Auto GPT具有以下优点 Auto GPT的能力 Auto GPT的能力非常强大,它可以应用于各种文本生成场景,包括但不限于以下几个方面 Auto GPT的历史 马斯克说:“ChatGPT 好得吓…

【C++从0到王者】第三站:类和对象(中)赋值运算符重载

文章目录 一、运算符重载1.运算符重载的使用2.运算符重载的注意事项 二、赋值运算符重载1.复制拷贝与拷贝构造2.赋值运算符重载的格式3.赋值运算符重载的实现4.赋值运算符重载的注意事项 一、运算符重载 1.运算符重载的使用 当我们实现一个日期类的时候,我们有时候…

一个*泰NL18-20漏电保护器的拆解

一个*泰NL18-20漏电保护器的拆解,购买很早了,损坏,按test按钮无动作,昨天用一个雷*的63A漏保替换了。 NL18-20的电流只有20A。显然不适合现在的运用了。而且是无灭弧装置,所以分断能力有限。 好奇,拆开来看…

C++PrimerPlus第四章编程题

编程题 题目总览 编程题题解 题目要求输入四次信息,有四次交互的输入(in),最后在一口气列举出来。同时对于firstname与lastname进行了拼接,而且对于输入的成绩进行降级操作。同时对于名字name的要求是可以输入多个单词…

使用Flink MySQL cdc分别sink到ES、Kafka、Hudi

环境说明 [flink-1.13.1-bin-scala_2.11.tgz](https://archive.apache.org/dist/flink/flink-1.13.1/flink-1.13.1-bin-scala_2.11.tgz)[hadoop-2.7.3.tar.gz](https://archive.apache.org/dist/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz)[flink-cdc-connectors](https:…

【Base64】前后端图片交互(2)

使用Base64去处理前后端图片交互 一、Base64编码介绍二、java.util.Base64 介绍源码分析编码译码 三、使用 Base64 前后端图片交互(实操)四、效果展示五、总结 绪论:在此之前小编发过一次前后端交互处理的方式:前后端图片交互的简…

深度学习之图像分类(三):VGGNet

系列文章目录 本专栏介绍基于深度学习进行图像识别的经典和前沿模型,将持续更新,包括不仅限于:AlexNet, ZFNet,VGG,GoogLeNet,ResNet,DenseNet,SENet,Mobile…

Windows磁盘空间不够,发现DriverStore文件夹特别大

正想安装一个新的VS2022,但是发现C盘的空间已经不足, 显示为红色了,这样不能安装。只好找一下C盘的空间为什么不足了,后来发现有一个目录特别大,这个目录就是DriverStore文件夹。由于电脑已经运行5年了,也…

Java的线程

介绍线程 线程是系统调度的最小单元,一个进程可以包含多个线程,线程是负责执行二进制指令的。 每个线程有自己的程序计数器、栈(Stack)、寄存器(Register)、本地存储(Thread Local&#xff09…

Linux的基本权限

基本权限 1.权限的概念2.Linux上的用户分类2.1. 如何切换用户? 3.Linux的权限管理3.1. 文件访问者的分类(人)3.2.文件类型和访问权限(文件属性)3.2.1. 文件类型3.2.2. 基本权限 3.3. 文件权限值的表示方法3.3.1. 字符表…

Mac中idea快捷键(Keymap->macOS)

背景: mac:MacBook Pro(13英寸,M2,2022年) 系统版本:12.4 idea快捷键配置:本文快捷键设置基于macOS(Keymap->macOS) 一、常用快捷键 1.commandF 在当前…

java类和对象2

文章目录 一、Java实例变量和类变量二、Java实例方法和类方法三、Java方法重载四、Java this关键字五、Java包六、Java import语句七、Java访问权限八、Java基本类型的类封装九、Java jar文件总结 一、Java实例变量和类变量 实例变量和类变量的定义 在声明成员变量时&#xf…

微信云开发之云函数小例子

环境 微信开发者工具 Stable 1.06.2303220云开发控制台 v1.5.47 概述 云函数即在云端(服务器端)运行的函数,代码运行在云端Node.js中。我们可以使用云函数SDK中提供的数据库和存储API进行数据库和存储的操作。 云函数的独特优势在于与微信…

centos,搭建ftp服务;vsftpd

安装vsftpd 使用yum安装vsftpd: yum install -y vsftpd 配置vsftpd 编辑vsftpd配置文件: vim /etc/vsftpd/vsftpd.conf 以下是一些常见的配置项: anonymous_enableNO local_enableYES write_enableYES local_umask022 dirmessage_enableYE…

职场新人必备:10个写进备忘录的职场tips

作为职场新人,如何快速适应、获得成长和提升自己,是每个人都面临的挑战。在这个竞争激烈的职场中,拥有一些实用的职场tips,可以帮助你更好地应对各种挑战,获得成功。在本文中,我们将分享10个写进备忘录的职…