面向对象【interface接口、抽象类与抽象方法】

请添加图片描述

文章目录

  • interface接口
    • 定义接口
    • 接口的格式与举例
    • 静态方法
    • 私有方法
    • 接口的多继承
    • 接口的默认方法冲突解决
    • 接口与抽象类之间的对比
  • 抽象类与抽象方法
    • 抽象类
    • 抽象类的定义
    • 抽象方法
    • 使用抽象类
  • 参考链接

interface接口

接口是一种抽象的数据类型,它定义了一组方法,但没有提供方法的具体实现。在
Java中,接口是一种与类类似的结构,但它只包含常量抽象方法的定义。类可以实现一个或多个接口,从而获得接口定义的方法。

定义接口

使用interface关键字来定义接口,接口中的方法默认为抽象方法,可以包含常量和默认方法(在Java 8及以后版本)。

public interface MyInterface {// 抽象方法void myMethod();// 常量int MAX_VALUE = 100;// 默认方法(Java 8及以后版本)default void defaultMethod() {System.out.println("This is a default method.");}
}

接口的格式与举例

接口的格式如下:

public interface InterfaceName {// 常量// 抽象方法// 默认方法(Java 8及以后版本)// 静态方法(Java 8及以后版本)// 私有方法(Java 9及以后版本)
}

接口的举例:

// 定义接口
public interface Teacher {// 抽象方法void teach();// 默认方法default void greet() {System.out.println("Hello, I'm a teacher.");}// 常量int MAX_STUDENTS = 30;
}// 实现接口
public class MathTeacher implements Teacher {@Overridepublic void teach() {System.out.println("Teaching Math.");}
}// 使用接口
public class InterfaceExample {public static void main(String[] args) {// 创建实现接口的对象MathTeacher mathTeacher = new MathTeacher();// 调用抽象方法mathTeacher.teach();// 调用默认方法mathTeacher.greet();// 访问常量System.out.println("Maximum students: " + Teacher.MAX_STUDENTS);}
}

静态方法

Java 8及以后版本允许在接口中定义静态方法。静态方法可以通过接口名直接调用,不需要实例化接口。

public interface MyInterface {// 静态方法static void staticMethod() {System.out.println("This is a static method.");}
}

私有方法

Java 9及以后版本允许在接口中定义私有方法,用于在接口内部复用代码。私有方法只能在接口内部调用,不能在实现接口的类中使用

public interface MyInterface {// 默认方法default void defaultMethod() {// 调用私有方法System.out.println("Result: " + privateMethod());}// 私有方法private int privateMethod() {return 42;}
}

接口的多继承

一个类可以实现多个接口,从而具有多个接口的方法。这使得Java支持了一种接近多继承的机制。

public interface Teacher {void teach();
}public interface Singer {void sing();
}public class Musician implements Teacher, Singer {@Overridepublic void teach() {System.out.println("Teaching music.");}@Overridepublic void sing() {System.out.println("Singing a song.");}
}

接口的默认方法冲突解决

public interface A {default void myMethod() {System.out.println("Method in interface A");}
}public interface B {default void myMethod() {System.out.println("Method in interface B");}
}public class MyClass implements A, B {// 手动解决冲突@Overridepublic void myMethod() {A.super.myMethod(); // 或者 B.super.myMethod();}
}

接口与抽象类之间的对比

在这里插入图片描述

抽象类与抽象方法

抽象类

随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类

抽象类的定义

抽象类是用abstract关键字声明的类,它可以包含抽象方法和具体方法。抽象类不能被实例化,通常用作其他类的基类

public abstract class Shape {// 抽象方法public abstract double calculateArea();// 具体方法public void display() {System.out.println("This is a shape.");}
}

抽象方法

抽象方法是用abstract关键字声明的方法,它没有方法体,只有方法签名。抽象方法必须在抽象类中声明,由子类提供具体实现。

public abstract class Animal {// 抽象方法public abstract void makeSound();// 具体方法public void sleep() {System.out.println("The animal is sleeping.");}
}

使用抽象类

使用抽象类时,通常需要创建其子类并实现其中的抽象方法。

// 抽象类 - 人员
public abstract class Person {private String name;private int age;// 构造方法public Person(String name, int age) {this.name = name;this.age = age;}// 抽象方法 - 获取角色public abstract String getRole();// 具体方法 - 显示基本信息public void displayInfo() {System.out.println("Name: " + name);System.out.println("Age: " + age);System.out.println("Role: " + getRole());}
}// 子类 - 老师
public class Teacher extends Person {private String subject;// 构造方法public Teacher(String name, int age, String subject) {super(name, age);this.subject = subject;}// 实现抽象方法@Overridepublic String getRole() {return "Teacher";}// 具体方法 - 显示老师信息public void teach() {System.out.println("Teaching " + subject);}
}// 子类 - 学生
public class Student extends Person {private String grade;// 构造方法public Student(String name, int age, String grade) {super(name, age);this.grade = grade;}// 实现抽象方法@Overridepublic String getRole() {return "Student";}// 具体方法 - 学习public void study() {System.out.println("Studying in grade " + grade);}
}// 使用抽象类的例子
public class SchoolExample {public static void main(String[] args) {// 创建老师对象Teacher teacher = new Teacher("Mr. Smith", 35, "Mathematics");teacher.displayInfo();teacher.teach();System.out.println();// 创建学生对象Student student = new Student("Alice", 15, "10th");student.displayInfo();student.study();}
}

Person是一个抽象类,定义了人员的基本属性和方法,其中包括一个抽象方法getRole()。TeacherStudent分别是Person的子类,实现了getRole()方法,并分别添加了特定的方法(teach()和study())。通过使用抽象类,我们可以将共有的行为和属性提取到父类中,实现了代码的重用和更好的组织结构。

参考链接

[1] w3cschool
[2] oracle

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

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

相关文章

c语言基础~函数详解

前言 今天我们来学习一波函数的概念,帮助各位理解函数,本次博客取自一些书籍以及各大网站的讲解,把它整合在一起并且详细讲解 1函数的理解 我们得知道什么是函数,函数的作用是什么,好不会表述没关系,我们翻书 c primer plus 是这么说的"函数是指…

科技云报道:第五次工业革命,中国AI企业如何打造新质生产力?

科技云报道原创。 人类历史的叙述与技术进步的影响深深交织在一起。 迄今为止,每一次工业革命都彻底改变了我们社会的轮廓,引入了机械化、大规模生产和数字化,并重新定义了人类生存的规范。 自2022年11月30日OpenAI发布ChatGPT以来&#x…

C++Qt学习——QFile、QPainter、QChart

目录 1、QFile(文本读写)——概念 1.1、拖入三个控件,对pushButton进行水平布局,之后整体做垂直布局 1.2、按住控件,转到槽,写函数 1.3、打开文件控件 A、首先引入以下两个头文件 B、设置点击打开文件控…

C++进阶之路---手撕“红黑树”

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、红黑树的概念与性质 1.概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点…

多模态数据融合简介#翻译

翻译自—— 感谢外国友人分享,鄙人在此翻译分享给大家INTRODUCTION TO DATA FUSION. multi-modality | by Haylat T | Haileleol Tibebu | Medium 多模态梳理_多模态图像和多模态方法的区别-CSDN博客 #这个网u也写得不错! 多模态 神经网络是最著名的机…

idea远程试调jar、远程试调war

idea远程试调jar、远程试调war 目的&#xff1a;测试运行时与ide开发时是否一致。 配置jar Maven中添加 <packaging>jar</packaging>将其打包为jar。 设置运行入口main 编译jar 看到jar输出 配置试调 添加jar运行 远程试调 先在源码中打好断点试调 debug运行…

React的基本使用

安装VSCode插件 ES7 Reactopen in browser React基本使用 基本使用步骤 引入两个JS文件&#xff08; 注意引入顺序 &#xff09; <!-- react库, 提供React对象 --> //本地 <script src"../js/react.development.js"></script> //线上 //<scr…

Python大数据实践:selenium爬取京东评论数据

准备工作 selenium安装 Selenium是广泛使用的模拟浏览器运行的库&#xff0c;用于Web应用程序测试。 Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样&#xff0c;并且支持大多数现代 Web 浏览器。 #终端pip安装 pip install selenium #清华镜像安装 p…

【Ubuntu】Ubuntu的安装和配置

下载ubuntu镜像 https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-desktop-amd64.iso 一、Ubuntu安装 1.新建虚拟机 1.1按照它的提示创建用户&#xff1b;后面一直下一步就好 2.启动Ubuntu虚拟机 2.1设置为中文键盘 2.2默认即可&#xff1b;若是有低需求也可以选择最小…

企业开展开源安全治理必要性及可行性详细分析

背景 开源软件安全威胁是近几年企业安全面临的主要威胁&#xff0c;也是企业应用安全方向讨论的热门话题&#xff0c;但是由于是新的需求新的方向&#xff0c;很多企业在观望&#xff0c;当前开展这项工作是否已经成熟&#xff0c;项目成功率如何&#xff1f; 当新鲜事物产生时…

【C语言】linux内核软中断

一、什么是软中断&#xff1f; 内核中的软中断&#xff08;Softirqs&#xff09;和任务下半部&#xff08;Tasklets&#xff09;是Linux内核中用于在中断上下文之外处理中断服务的一种底层机制。这些机制解决了不能在中断服务例程&#xff08;ISR&#xff09;中执行耗时操作或…

Apache Doris 2.1 核心特性 Variant 数据类型技术深度解析

在最新发布的 Apache Doris 2.1 新版本中&#xff0c;我们引入了全新的数据类型 Variant&#xff0c;对半结构化数据分析能力进行了全面增强。无需提前在表结构中定义具体的列&#xff0c;彻底改变了 Doris 过去基于 String、JSONB 等行存类型的存储和查询方式。为了让大家快速…

在IDEA中设置使用鼠标滚轮控制字体大小

IDEA是我们常用的程序编程工具&#xff0c;有时为了方便&#xff0c;我们需要随时的调整字体的大小 本篇文章我使用了两种方式来设置IDEA中的字体大小 方式一&#xff1a;使用传统的方式来设置 首先在IDEA顶部的菜单栏中选择“file”菜单 然后在“file”菜单中选择“Setting…

Gitlab-runner注册与配置

文章目录 概要操作流程获取HTTPS证书上传证书修改gitlab-runner dns配置文件gitlab-runner 注册 概要 本文主要介绍了Gitlab-runner在内网环境注册到gitlab的操作方式。内网环境如下&#xff1a; 1、gitlab-runner由docker镜像部署&#xff1b; 2、gitlab部署与内网&#xff0…

3D Tiles语义分割流水线

Dylan Chua 和 Anne Lee 开发了一个处理管线&#xff0c;用于对 3D Tiles 中包含的 GL 传输格式 (glTF) 模型进行语义分割。 该管道读取并遍历 3D Tileset&#xff0c;以输出包含元数据的经过转换的划分对象集。 该项目为 3D 语义分割器提供了最小可行产品&#xff0c;作为各种…

视频技术2:把rtsp转为各种格式,包括webrtc

前题是启动ABLMediaServer&#xff0c;把ini里的hls_enable1 1、添加rtsp到视频服务器 http://127.0.0.1:7088/index/api/addStreamProxy?secret035c73f7-bb6b-4889-a715-d9eb2d1925cc&vhost_defaultVhost_&appMedia&streamCamera_00001&enable_hls1&ur…

【数据结构与算法】设计循环队列

&#x1f9d1;‍&#x1f393;个人主页&#xff1a;简 料 &#x1f3c6;所属专栏&#xff1a;C &#x1f3c6;个人社区&#xff1a;越努力越幸运社区 &#x1f3c6;简 介&#xff1a;简料简料&#xff0c;简单有料~在校大学生一枚&#xff0c;专注C/C/GO的干货分…

2022年第十三届蓝桥杯比赛Java B组 【全部真题答案解析-第一部分】

最近回顾了Java B组的试题&#xff0c;深有感触&#xff1a;脑子长时间不用会锈住&#xff0c;很可怕。 兄弟们&#xff0c;都给我从被窝里爬起来&#xff0c;赶紧开始卷&#xff01;&#xff01;&#xff01; 2022年第十三届蓝桥杯Java B组(第一部分 A~F题) 目录 一、填空题 …

详解基于快速排序算法的qsort的模拟实现

目录 1. 快速排序 1.1 快速排序理论分析 1.2 快速排序的模拟实现 2. qsort的模拟实现 2.1 qsort的理论分析 2.2 qsort的模拟实现 qsort函数是基于快速排序思想设计的可以针对任意数据类型的c语言函数。要对qsort进行模拟实现&#xff0c;首先就要理解快速排序。 1. 快…

【数据结构】堆的创建

文章目录 一、堆的概念及结构1、什么是堆2、堆的性质3、堆的结构及分类 二、堆的创建1、堆向下调整算法2、堆向上调整算法3、堆的创建&#xff08;向上调整算法&#xff09; 一、堆的概念及结构 1、什么是堆 堆就是以二叉树的顺序存储方式来存储元素&#xff0c;同时又要满足父…