java后端开发day23--面向对象进阶(四)--抽象类、接口、内部类

news2025/3/1 9:36:30

在这里插入图片描述
(以下内容全部来自上述课程)
在这里插入图片描述
在这里插入图片描述

1.抽象类

父类定义抽象方法后,子类的方法就必须重写,抽象方法在的类就是抽象类。

1.定义

  • 抽象方法
    共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样的,
    所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。

  • 抽象类
    如果一个类中存在抽象方法,那么该类就必须声明为抽象类

2.定义格式

  • 抽象方法
    public abstract 返回值类型 方法名(参数列表); (无{}方法体)

  • 抽象类
    public abstract class 类名{}

3.注意事项

  • 抽象类不能实例化(不能创建对象
  • 抽象类中不一定有抽象方法,有抽象方法的一定是抽象类
  • 可以有构造方法(javabean里的方法)
    作用:当创建子类对象时,给属性进行赋值的。
  • 抽象类的子类:
    要么重写抽象中的所有抽象方法
    要么是抽象类

2.接口

接口就是一种规则,是对行为的抽象。
不是仅自己独有的能力可以定义为接口。
请添加图片描述

1.定义和使用

  • 接口用关键字interface来定义
    public interface 接口名{}

  • 接口不能实例化

  • 接口和类之间是实现关系,通过implements关键字表示
    public class 类名 implements 接口名{}

  • 接口的子类(实现类)
    要么重写接口中的所有抽象方法
    要么是抽象类

注意1:
接口和类的实现关系,可以但单实现,也可以多实现。
public class 类名 implements 接口名1,接口名2{}
注意2:
实现类还可以在继承一个类的同时实现多个接口。
public class 类名 extends 父类 implements 接口名1,接口名2{}

新建接口:
请添加图片描述

2.接口中成员的特点

1.成员变量
  • 只能是常量
  • 默认修饰符:public static final
2.构造方法

没有

3.成员方法
  • 只能是抽象方法
  • 默认修饰符:public abstract
  • JDK7以前:接口中可以定义有方法体的方法
  • JDK8的新特性:接口中可以定义有方法体的方法。
  • JDK9的新特性:接口中可以定义私有方法。

3.接口和类之间的关系

1.类和类的关系

继承关系,只能单继承,不能多继承,但是可以多层继承

2.类和接口的关系

实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口

3.接口和接口的关系

继承关系,可以单继承,也可以多继承
细节:如果实现类实现了最下面的子接口,那么就需要重写所有的抽象方法

4.多学三招

1.JDK8开始接口中新增的方法
  • JDK7以前:接口中只能定义抽象方法
  • JDK8的新特性:接口中可以定义有方法体的方法。(默认,静态)
  • JDK9的新特性:接口中可以定义私有方法。
1.默认方法
  • 允许在接口中定义默认方法,需要使用关键字default修饰
    作用:解决接口升级的问题。

接口中默认方法的定义格式:

  • 格式:public default 返回值类型 方法名(参数列表){ }
  • 范例:public default void show(){ }

接口中默认方法的注意事项:

  • 默认方法不是抽象方法,所以不强制重写。但是如果被重写,重写的时候去掉default关键字
  • public可以省略,default不能省略
  • 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
2.静态方法

允许在接口中定义定义静态方法,需要用static修饰

接口中静态方法的定义格式:

  • 格式:public static 返回值类型 方法名(参数列表){ }
  • 范例:public static void show(){ }

接口中静态方法的注意事项:

  • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
  • public可以省略,static不能省略
3.JDK9新增的方法

接口中私有方法的定义格式:

  • 格式1:private 返回值类型 方法名(参数列表){ }
  • 范例1:private void show(){ }
  • 格式2:private static 返回值类型 方法名(参数列表){ }
  • 范例2:private static void method(){ }
2.接口的应用
  • 接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了。
  • 当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。
3.适配器设计模式

简单来说:设计模式就是各种套路
适配器设计模式:解决接口与接口实现类之间的矛盾问题。
当一个接口中抽象方法过多,但是我要使用其中一部分的时候,就可以用适配器设计模式。

书写步骤:

  • 编写中间类XXXAdapter。实现对应接口
  • 对接口中的抽象方法进行空实现
  • 让真正的实现类继承中间类,并重写需要用的方法
  • 为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰

3.内部类

类的五大成员:
属性、方法、构造方法、代码块、内部类

1.定义

在一个类的里面,再定义一个类。
内部类表示的事物是外部类的一部分
内部类单独出现没有任何意义
比如:汽车的发动机,人的心脏等

内部类的访问特点:

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象 (new一个)

2.分类

1.成员内部类(了解)

写在成员位置的。属于外部类的成员。
成员内部类可以被一些修饰符所修饰,比如:private、默认、protected、public、static等
在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量

获取成员内部类对象的两种方式:

  1. 外部类编写方法,对外提供内部类对象
  2. 直接创建
  3. 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
  4. 范例:Outer.Inner oi = new Outer().new Inner();

内存图请添加图片描述

2.静态内部类(了解)

静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象(new一个)

创建静态内部类对象的格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
调用非静态方法的格式:先创建对象,用对象调用
调用静态方法的格式:外部类名.内部类名.方法名();

3.局部内部类(了解)

将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。
外界是无法直接使用的,需要在方法内部创建对象并使用(new一个)
该类可以直接访问外部类的成员,也可以访问方法内的局部变量

4.匿名内部类(掌握)

匿名内部类本质上就是隐藏了名字(只是不用自己起)的内部类。
可以写在成员位置,也可以写在局部位置。

细节:
包含了继承(类)或实现(接口),方法重写,创建对象。
整体就是一个类的子类对象或者接口的实现类对象。

使用场景:
当方法的参数是接口或者类时,
以接口为例,可以传递这个接口的实现类对象,
如果实现类只要使用一次,就可以用匿名内部类简化代码。
请添加图片描述
格式理解:(很牛,建议亲自去听)
请添加图片描述

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

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

相关文章

Go - 泛型的使用

泛型的语法 泛型为Go语言添加了三个新的重要特性: 函数和类型的类型参数。将接口类型定义为类型集,包括没有方法的类型。类型推断,它允许在调用函数时在许多情况下省略类型参数。 类型参数 类型参数的使用 除了函数中支持类型参数列表外&#xff0c…

蓝桥杯刷题-dp-线性dp(守望者的逃离,摆花,线段)

[NOIP 2007 普及组] 守望者的逃离 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。 守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。 为了杀死守望者,尤迪安开始对这个荒岛…

内容中台的企业CMS架构是什么?

企业CMS模块化架构 现代企业内容管理系统的核心在于模块化架构设计,通过解耦内容生产、存储、发布等环节构建灵活的技术栈。动态/静态发布引擎整合技术使系统既能处理实时更新的产品文档,也能生成高并发的营销落地页,配合版本控制机制确保内…

算法题(81):询问学号

审题: 需要我们根据给出的n值确定录入数据个数,然后根据给出的数据存储学号。再根据m值确定需要输出的学号个数,然后根据数组内容输出学号 思路: 我们可以利用数组进行数据顺序存储,以及随机读取完成本题 由于学号最大为1e9&#…

React antd的datePicker自定义,封装成组件

一、antd的datePicker自定义 需求:用户需要为日期选择器的每个日期单元格添加一个Tooltip,当鼠标悬停时显示日期、可兑换流量余额和本公会可兑流量。这些数据需要从接口获取。我需要结合之前的代码,确保Tooltip正确显示,并且数据…

C++ AVL树详解(含模拟实现)

目录 AVL树的概念 AVL树节点的定义 AVL树的插入 AVL树的旋转(难点) AVL树的验证 AVL树的删除(本文不做具体的模拟实现) AVL树的性能 AVL树的模拟实现 AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索…

Spring Boot 3.x 系列【3】Spring Initializr快速创建Spring Boot项目

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.3 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 前言安装JDK 17创建Spring Boot 项目 方式1:网页在线生成方式2&#…

Elasticsearch:过滤 HNSW 搜索,快速模式

作者:来自 Elastic Benjamin Trent 通过我们的 ACORN-1 算法实现,探索我们对 Apache Lucene 中的 HNSW 向量搜索所做的改进。 多年来,Apache Lucene 和 Elasticsearch 一直支持使用 kNN 查询的过滤搜索,允许用户检索符合指定元数据…

【AI测试学习】AnythingLLM+Ollama+DeepSeek部署私人知识库

1.搭建DeepSeek大语言模型 1.1Ollama大预言模型部署 Ollama简化了大型语言模型的运行,让每个人都能在本地轻松体验AI的强大,打开浏览器-下载Ollama-输入命令-搞定,这是本地部署大语言模型的全新方式。 这里我们借助Ollama大预言模型部署工具进行搭建 官网如下:Ollama …

通义灵码插件安装入门教学 - IDEA(安装篇)

在开发过程中,使用合适的工具和插件可以极大地提高我们的工作效率。今天,我们将详细介绍如何在 IntelliJ IDEA 中安装并配置通义灵码插件,这是一款旨在提升开发者效率的实用工具。无论你是新手还是有经验的开发者,本文都将为你提供…

ES、OAS、ERP、电子政务、企业信息化(高软35)

系列文章目录 ES、OAS、ERP、电子政务、企业信息化 文章目录 系列文章目录前言一、专家系统(ES)二、办公自动化系统(OAS)三、企业资源规划(ERP)四、典型信息系统架构模型1.政府信息化和电子政务2.企业信息…

python-leetcode-删除并获得点数

740. 删除并获得点数 - 力扣(LeetCode) 解法 1:动态规划(O(n) 时间,O(n) 空间) class Solution:def deleteAndEarn(self, nums: List[int]) -> int:if not nums:return 0# 统计每个数的贡献points Cou…

助力DeepSeek私有化部署服务:让企业AI落地更简单、更安全

在数字化转型的浪潮中,越来越多的企业选择私有化部署AI技术,以保障数据安全、提升业务效率并实现自主可控。DeepSeek作为行业领先的AI开源技术,其技术可以支持企业私有化部署,企业需要一站式服务私有化部署,涵盖硬件采…

【每天认识一个漏洞】url重定向

🌝博客主页:菜鸟小羊 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 常见应用场景 主要是业务逻辑中需要进行跳转的地方。比如登录处、注册处、访问用户信息、订单信息、加入购物车、分享、收…

纯代码实战--用Deepseek+SQLite+Ollama搭建数据库助手

如何用Python调用本地模型实现DeepSeek提示词模板:一步步教你高效解决13种应用场景 从零到一:纯代码联合PyQt5、Ollama、Deepseek打造简易版智能聊天助手 用外接知识库武装大模型:基于Deepseek、Ollama、LangChain的RAG实战解析 纯代码实战–…

2025 最新版鸿蒙 HarmonyOS 开发工具安装使用指南

为保证 DevEco Studio 正常运行,建议电脑配置满足如下要求: Windows 系统 操作系统:Windows10 64 位、Windows11 64 位内存:16GB 及以上硬盘:100GB 及以上分辨率:1280*800 像素及以上 macOS 系统 操作系统…

AI数字人开发,引领科技新潮流

引言 随着人工智能技术的迅猛发展,AI 数字人在影视娱乐、客户服务、教育及医疗等多个领域展现出巨大的潜力。本文旨在为开发者提供一份详细的 AI 数字人系统开发指南,涵盖从基础架构到实现细节的各个方面,包括人物建模、动作生成、语音交互、…

领域驱动设计:事件溯源架构简介

概述 事件溯源架构通常由3种应用设计模式组成,分别是:事件驱动(Event Driven),事件溯源(Event Source)、CQRS(读写分离)。这三种应用设计模式常见于领域驱动设计(DDD)中,但它们本身是一种应用设计的思想,不仅仅局限于DDD,每一种模式都可以单独拿出来使用。 E…

STM32之影子寄存器

预分频寄存器计数到一半的时候,改变预分频值,此时不会立即生效,会等到计数完成,再从影子寄存器即预分频缓冲器里装载修改的预分频值。 如上图,第一行是内部时钟72M,第二行是时钟使能,高电平启动…

x64汇编下过程参数解析

简介 好久没上博客, 突然发现我的粉丝数变2700了, 真是这几个月涨的粉比我之前好几年的都多, 于是心血来潮来写一篇, 记录一下x64下的调用约定(这里的调用约定只针对windows平台) Windows下的x64程序的调用约定有别于x86下的"stdcall调用约定"以及"cdecl调用约…