【JAVA】抽象类和接口

news2025/1/21 9:29:46

在这里插入图片描述

🏆今日学习目标:抽象类和接口
😃创作者:颜颜yan_
✨个人主页:颜颜yan_的个人主页
⏰本期期数:第二期
🎉专栏系列:JAVA


文章目录

  • 一、抽象类
    • 抽象类的定义规则
    • 示例
  • 二、接口
    • 接口定义与语法格式
    • 示例
    • 示例
  • 总结


一、抽象类

定义一个类时常常需要定义一些成员方法用于描述类的行为特征,但有时这些方法的实现方式是无法确定的。例如上期定义的 Animal类中的 shout()方法用于描述动物的叫声,但是不同的动物叫声也不相同,因此在 shout()方法中无法准确描述动物的叫声。

针对上面描述的情况,Java 提供了抽象方法来满足这种需求。抽象方法是使用abstract 关键字修饰的成员方法,抽象方法在定义时不需要实现方法体。

抽象方法的语法格式如下:

		abstract 返回值类型 方法名称(参数列表);

当一个类包含了抽象方法,该类就是抽象类。抽象类和抽象方法一样,必须使用abstract 关键字进行修饰。抽象类的语法格式如下:

		abstract class 抽象类名称{
			属性;
			访问权限 返回值类型 方法名称(参数){ //普通方法
				return [返回值];
			}
			访问权限 abstract 返回值类型 抽象方法名称(参数); 	//抽象方法,无方法体
		}

从上面抽象类的语法格式中可以发现,抽象类的定义比普通类多了一个或多个抽象方法,其他地方与普通类的组成基本相同。

抽象类的定义规则

(1)包含抽象方法的类必须是抽象类
(2)声明抽象类和抽象方法时都要使用== abstract== 关键修饰。
(3)抽象方法只需要声明而不需要实现。
(4)如果一个非抽象类继承了抽象类之后,那么该类必须重写抽象类中的全部抽象方法。

示例

Animal类:

//定义抽象类Animal
abstract class Animal {
    //定义抽象方法shout()
    abstract void shout();
}

Dog类:

//定义Dog类继承抽象类Animal
class Dog extends Animal{
    //重写抽象方法shout()
    @Override
    void shout() {
        System.out.println("汪汪汪……");
    }
}

测试类:

//定义测试类
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();  //创建Dog类的对象
        dog.shout();  //通过dog对象调用shout()方法

    }
}

在上述代码中,声明了Animal抽象类,在Animal中定义了抽象方法shout();在Dog类中重写了父类Animal类的抽象方法shout();在测试类中创建了Dog对象,并使用Dog对象调用shout()方法,实现控制台输出的“汪汪汪……”信息。

控制台输出信息如下图:
在这里插入图片描述
由上图可知,控制台输出“汪汪汪……”,说明了dog对象调用了Dog类中重写的父类Animal的抽象方法shout()。
使用 abstract 关键字修饰的抽象方法不能使用 private 关键字修饰,因为抽象方法必须被子类实现,如果使用了 private 关键字修饰抽象方法,则子类无法实现该方法。

二、接口

接口定义与语法格式

==接口是一种用来定义程序的协议,它用于描述类或结构的一组相关行为。==接口是由抽象类衍生的一个概念,并由此产生了一种编程方式,可以称这种编程方式为面向接口编程。面向接口编程就是将程序的不同的业务逻辑分离,以接口的形式对接不同的业务模块。按口中不实现任何业务逻辑,业务逻辑由接口的实现类完成。当业务需求变更时,只需要修改实现类中的业务逻辑,而不需要修改接口中的内容,以减少需求变更对系统产生的影响。

下面通过现实生活中的例子来类比面向接口编程。例如,鼠标、U 盘等外部设备通过USB 接口来连接计算机,即插即用,非常灵活。如果需要更换与计算机连接的外部设备,只需要拔掉当前 USB 接口上的设备,把新的设备插入即可,这就是面向接口编程的思想。

在Java 中,使用接口的目的是克服单继承的限制,因为一个类只能有一个父类,而一个类可以同时实现多个父接口。在JDK 8之前,接口是由全局常量和抽象方法组成的。JDK 8对接口进行了重新定义,接口中除了抽象方法外,还可以定义默认方法和静态方法,默认方法使用 default 关键字修饰,静态方法使用 static 关键字修饰,而且这两种方法都允许有法体。

接口使用 interface 关键字声明,语法格式如下:

[public] interface 接口名 [extends 接口1,接口2,..]{
[public][static] [final] 数据类型 常量名 =常量;
[public] [abstract] 返回值的数据类型 方法名(参数列表);
[public] static 返回值的数据类型 方法名(参数列表){}
[public] default 返回值的数据类型 方法(参数列表){}
}

上述语法格式中,“extends 接口1,接口2,…”表示一个接口可以有多个父接口,父接口之间使用逗号分隔。接口中的变量默认使用 public static final 进行修饰,即全局常量。接口中定义的抽象方法默认使用 public abstract 进行修饰。

在很多的 Java 程序中,经常看到编写接口中的方法时省略了 public,有很多读者认为它的访问权限是 default,这实际上是错误的。不管写不写访问权限,接口中方法的访问权限永远是 public。

接口本身不能直接实例化,接口中的抽象方法和默认方法只能通过接口实现类的实例对象进行调用。实现类通过== implements== 关键字实现接口,并且实现类必须重写接口中所有的抽象方法。需要注意的是,一个类可以同时实现多个接口,实现多个接口时,多个接口名需要使用英文逗号(,)分隔。

定义接口实现类的语法格式如下:

修饰符 class 类名 implements 接口 1,接口 2,……{
	……
}

示例

Animal接口:

//定义接口Animal
interface Animal {
        int ID = 1;  //定义全局常量,编号
        String NAME ="牧羊犬";  //定义全局常量,名称
        void shout();   //定义抽象方法 shout()
        public void info();  //定义抽象方法 info()
        static int getID(){  //定义静态方法 getID(),用于返回 ID值
            return Animal.ID;
        }
}

Action接口:

interface Action {
    public  void eat();
}

Dog类:

//定义Dog类实现抽象类Animal和Action
class Dog implements Animal,Action{
    //重写抽象方法shout()
    @Override
    public void shout() {
        System.out.println("汪汪汪……");
    }
    //重写Animal接口中的抽象方法info()
    @Override
    public void info() {
        System.out.println("名称:"+NAME);
    }
//重写Action接口中的抽象方法eat()
    @Override
    public void eat() {
        System.out.println("喜欢吃骨头");
    }
}

测试类:

//定义测试类
public class Main {
    public static void main(String[] args) {
        System.out.println("编号:"+Animal.getID());
        Dog dog = new Dog();  //创建Dog类的对象
        dog.info();  //调用Dog中重写的info()方法
        dog.shout();  //调用Dog中重写的shout()方法
        dog.eat();   //调用Dog中重写的eat()方法
    }
}

在上述代码中,定义了 Animal接口,在Animal接口中定义了全局常量ID和NAME、抽象方法 shout()、info()和静态方法 getID()。定义了Action接口,在Action 接口中定义了抽象方法 eat(),用于输出信息“喜欢吃骨头”。定义了Dog类,Dog 类通过implements关键字实现了Animal接口和Actio接口,并重写了这两个接口中的抽象方法。使用 Animal 接口名直接访问了Animal接口中的静态方法 getID(),输出编号信息。测试代码中创建了 Dog 类的象 dog,并通过 dog 对象调用重写的 info()方法、shout()方法以及 eat()方法。

运行结果:
在这里插入图片描述

需要注意的是,接口的实现类必须实现接口中的所有抽象方法,否则程序编译报错。

上述代码演示的是类与接口之间的实现关系。如果在开发中一个子类既要实现接口又要继承抽象类,则可以按照以下语法格式定义子类

	修饰符 class 类名 extends 父类名 implements 接口 1,接日2,……{
			……
	}

下面对上述代码稍加修改,演示一个类既可以实现接口又可以继承抽象类的情况。修改后的代码如下:

Animal接口:

//定义接口Animal
interface Animal {
       
        public String NAME ="牧羊犬";  //定义全局常量,名称
        public void shout();   //定义抽象方法 shout()
        public void info();  //定义抽象方法 info()
        }
}

Action接口:

//定义抽象类Action
interface Action {
    ppublic abstract void eat(); //定义抽象方法eat()
}

Dog类:

//定义Dog类继承Action抽象类,并且实现Animal接口
class Dog extends Animal,Action{
	//重写Action接口中的抽象方法eat()
    @Override
    public void eat() {
        System.out.println("喜欢吃骨头");
    }
    //重写Animal中的抽象方法shout()
    @Override
    public void shout() {
        System.out.println("汪汪汪……");
    } 
     //重写Animal接口中的抽象方法info()
      @Override
    public void info() {
        System.out.println("名称:"+NAME);
    }
}

测试类:

//定义测试类
public class Main {
    public static void main(String[] args) {
        System.out.println("编号:"+Animal.getID());
        Dog dog = new Dog();  //创建Dog类的对象
        dog.info();  //调用Dog中重写的info()方法
        dog.shout();  //调用Dog中重写的shout()方法
        dog.eat();   //调用Dog中重写的eat()方法
    }
}

在上述的代码中,定义了Animal接口,其中声明了全局变量NAME(名称)和抽象方法 shout()info()。定义了抽象类 Action,其中定义了抽象方法 eat()。定义了 Dog 类,它通过 extends 关键字继承了 Action 抽象类同时通过 implements 重写了 Animal接口。Dog 类重写了 Animal 接口和 Action 抽象类中的所有抽象方法,包括 shout()方法、info()方法和 eat()方法。测试类代码创建了Dog 类对象 dog,通过该对象分别调用了 ino()、shout()和 eat()方法。

运行结果如图所示:
在这里插入图片描述
由图 可知,控制台输出“名称: 牧羊犬”和“汪汪…”,证明 Dog 类成功重写Animal接口的 info()方法和shout()方法;控制台输出“喜欢吃骨头”,证明 Dog 类成功Action 抽象类的 eat()方法。这说明,Dog 类的实例化对象可以访问该类实现的接F抽象类的方法。

在 Java 中,接口不允许继承抽象类,但是允许接口继承接口,并且一个接口可以同时继承多个接口。

示例

Animal接口

//定义接口Animal
interface Animal {
        public String NAME ="牧羊犬";  //定义全局常量,名称
        public void info();  //定义抽象方法 info()
}

Action接口:

//定义Action接口,同时继承Animal接口和Color接口
interface Action extends Animal,Color {
    public abstract void shout();
}

Dog类:

//定义Dog类实现Action接口
    class Dog implements Action{
    //重写Animal接口中的抽象方法info()
    @Override
    public void info() {
        System.out.println("名称:"+NAME);
    }
    //重写抽象方法shout()
    @Override
    public void shout() {
        System.out.println("汪汪汪……");
    }
    //重写Color接口中的抽象方法black
    @Override
    public void black() {
        System.out.println("黑色");
    }
}

测试类:

//定义测试类
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();  //创建Dog类的对象
        dog.info();  //调用Dog中重写的info()方法
        dog.shout();  //调用Dog中重写的shout()方法
        dog.black();   //调用Dog中重写的black()方法
    }
}

上述代码中,定义了 Action 接口并继承 Animal 接口和Color接口,这样 Action 接口中就同时拥有 Animal 接口中的 info()方法、NAME属性和 Color接口中的 black()方法以及本接口中的 shout()方法。

定义了 Dog 类并实现了 Action 接口,这样 Dog 类就必须同时重写Animal 接口中的抽象方法 info()、Color 接口中的抽象方法 black()和 Action 接口中的抽象方法 shout()。

测试代码创建了 Dog 类的对象 dog,通过 dog 对象调用重写的 shout()方法info()方法和 black()方法。

代码的运行结果如图:
在这里插入图片描述
由图 可知,控制台输出“名称:牧羊犬”,证明 Dog 类成功重写了 Action 接口继承自Animal接口的抽象方法 info();控制台输出“汪汪…”,证明 Dog 类成功重写了 Action接口的抽象方法 shout();控制台输出“黑色”,证明 Dog 类成功重写了 Ation 接口继承自Color 接口的抽象方法 black()。


总结

以上就是今天的学习内容啦~
如果有兴趣的话可以订阅专栏,持续更新呢~
咱们下期再见~
在这里插入图片描述

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

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

相关文章

Volatile关键字简述

Volatile关键字前言前置知识程序、进程、线程程序进程线程并发所涉及的一些特性线程安全原子性可见性Volatile案例环境代码展示可见性测试原子性测试前言 最近在看《Java并发编程实战》,期望对一些并发的知识点做一些总结。最好有一定的Java基础、并发的基础。 前…

Qt 一个信号对应多个槽,多个信号对应一个槽的执行顺序

前言: Qt独创的信号槽机制,不仅可以一个信号连接一个槽,而且可以一对多或多对一。 这其中存在两个最基本的问题: 1.一个信号对应多个槽时,槽函数的执行顺序是怎样的??? 2.多个信号对…

【操作系统三】图解网络IO(bio\nio\slect\epoll)

【操作系统三】图解网络IO实战一、计算机组成二、系统中断三、晶振(时间中断、分时复用)四、事件中断1、DMA2、事件中断3、网卡也会产生中断?五、linux系统知识1、linux下一切皆文件?1.1、nc启动一个服务端,端口号80801.2、linux下…

vulnhub靶机:matrix:1

目录 查看靶机的ip 开放端口扫描 解密 字典生成爆破 ssh登录 rbash逃逸 下载地址:Matrix: 1 ~ VulnHub Kali地址:192.168.174.128 靶机地址:192.168.174.139 这个靶机是我在刷到的一个视频,讲解这个靶机的博主比较有趣&a…

web网页设计期末课程大作业:水果网站设计——HTML+CSS+JavaScript水果超市(带论文)

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

大一学生Web课程设计 HTML+CSS保时捷汽车介绍(可以很好的应付老师的作业)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

2022CTF培训(八)ARM PWN 环境搭建ARM PWN 入门

附件下载链接 环境搭建 QEMU qemu是一款可执行硬件虚拟化的虚拟机,与他类似的还有Bochs、PearPC, 但qemu具有高速(配合KVM)、跨平台的特性 qemu主要有两种运行模式:qemu-user 和 qemu-system qemu-system 可以进行…

[附源码]Python计算机毕业设计高校互联网班级管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

[附源码]Nodejs计算机毕业设计基于的开放式实验室预约系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

k8s编程operator实战之云编码平台——④web后端实现

文章目录1、简介1.1 目录结构1.2 开发模式2、数据库设计2.1 user表2.2 space_template和space_kind表2.3 space和spacespec表3、gRPC客户端4、数据库访问4.1 mysql4.2 redis5、缓存加载5.1 通用缓存5.2 数据加载6、功能开发6.1 用户登录6.2 获取所有模板6.3 创建工作空间6.4 创…

如何进行C++动态转换

📒博客主页: ​​开心档博客主页​​ 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由开心档原创! 📆51CTO首发时间:🌴2022年12月12日🌴 ✉…

如何评价「仙剑奇侠传六」使用Unity 3D引擎?

2022年看到问题,根据2022年Unity3D、Unreal Engine及仙剑六来一波“穿越马后炮式”回答。 1: 2022年看到问题,根据2022年Unity3D、Unreal Engine及仙剑六来一波“穿越马后炮式”回答。 1: 仙剑奇侠传六确为unity引擎制作&#…

大学生简单静态HTML网页模板源码——家乡介绍美丽乡村11页

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…

【leetcode】将有序数组转换为二叉搜索树

一、题目描述 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1: 输入:nums …

微信对接chatGPT,实现自动回复消息、在线答疑等功能

前言 近来chatGPT挺火的,也试玩了一下,确实挺有意思。这里记录一下在在微信中也可以使用chatGPT,顺带可以自动回复微信消息、实时答疑等。。。 上一篇文章回顾:https://frica.blog.csdn.net/article/details/128316712 本文章在u…

Spark3.3.0的DataFrame及Spark SQL编程的性能对比【单机模式下】

Spark3.3.0的DataFrame及Spark SQL编程的性能对比【单机模式下】 前言 Spark3.3.0较老早的2.4.0有极大的性能优化,尤其是对SQL做了大量的优化【数据倾斜等】,恰好近期遇到一些性能问题,特意写个Demo测试下DataFrame和Spark SQL在获取到相同…

c#入门-接口的抽象成员和虚成员

接口的抽象成员 接口的成员如果不指定主体,那么就是抽象成员。 你可以主动为他们加抽象修饰符,不过没什么用。 interface I属性 {public abstract int Hp { get; set; }public abstract int Mp { get; set; } }接口的虚成员 接口的成员可以指定主体。…

Jina 开箱即用的云原生多模态系统解决方案

Jina 是一个基于云原生的多模态应用框架,开发者使用 Jina 可以轻松构建、部署和维护高性能的云原生应用。你可能认为这些都只是空泛的营销口号,甚至产生疑问,到底什么是云原生?对构建多模态应用有什么帮助?它是否只是 …

Linux CentoOs7中用命令打开并修改文本文件

概述:VI/VIM VI 是 Unix 操作系统和类 Unix 操作系统中最通用的**文本编辑器**。 VIM 编辑器是从 VI 发展出来的一个性能更强大的**文本编辑器**。可以主动的以字体颜色辨别语法的正确性,方便程序设计。VIM 与 VI 编辑器完全兼容。 我们常常用vim命令…

C#语言实例源码系列-实现热键屏幕和设置热键

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…