当前位置: 首页 > news >正文

抽象类和接口的简单认识

目录

一、抽象类

1.什么是抽象类

2.抽象类的注意事项

3.抽象类与普通类的对比

二、接口

1.接口的简单使用

2.接口的特性

3.接口的使用案例

4.接口和抽象类的异同

一、抽象类

所谓抽象类,就是更加抽象的类,也就是说,这个类不能具体描述某一个对象。

1.什么是抽象类

1.1.引入

下面这是一个子类继承父类,并且重写父类中的eat方法。 

class Animal {public String name;public Animal(String name) {this.name = name;}public void eat() {System.out.println("正在吃……");}
}
class dog extends Animal {public dog(String name) {super(name);}@Overridepublic void eat() {System.out.println(this.name+"正在吃奥里给!");}
}
public class Test {public static void main(String[] args) {Animal animal = new dog("旺财");animal.eat();}
}

运行结果:

我们可以发现,父类的eat方法似乎没有什么作用,也不能具体表现某一个具体动物。那我们可不可以不实现父类的eat方法呢?答案当然是可以的。

1.2.抽象方法与类引入

我们在上面的代码进行改进

上述操作完成一个抽象类和抽象方法的撰写。

1.3.抽象类的语法

一个方法没有实现,就需要用abstract修饰;如果一个类包含了抽象方法,那么这个类也必须用abstract修饰。 

(1)抽象方法

在修饰符后面,方法返回值前面加上abstract关键字,也可以不加修饰符

(2)抽象类

在class后面加上abstract关键字

2.抽象类的注意事项

抽象类和普通的类没有什么区别。但是可以比普通类多了抽象方法(可以不实现),也比普通类多了abstract关键字。

abstract class Animal {public String name;public Animal(String name) {this.name = name;}public abstract void eat();
}
class dog extends Animal {public dog(String name) {super(name);}@Overridepublic void eat() {System.out.println(this.name+"正在吃奥里给!");}
}
public class Test {public static void main(String[] args) {}
}

 继续使用上面的代码进行验证。

2.1.抽象类不能实例化

(1)实例化就会报错

(2)原因

因为抽象类不能具体表现一个对象,也就无法实例化

(3)用法

所以,抽象类的出现一般都要配合子类一起出现,借助子类来实例化对象。说明:抽象类一般都是发生在继承的继承上,同样可以发生向上转转型。

2.2.子类继承抽象类的注意点

(1)一个普通类,继承了这个抽象类,那么这个普通类就必须重写抽象类中的抽象方法。

(2)当抽象类中有构造方法,子类也需要调用构造方法来帮助父类进行初始化。

2.3.关于抽象类的语法

(1)抽象方法必须被重写,因此不能被private或final或static修饰

(2)抽象类中,可以有普通的成员变量和成员方法。

(3)A、B都是抽象类,B继承了A。此时有一个普通类C继承了B,C类要重写A、B中的所有抽象方法。(C->B->A)

2.4.抽象类的作用

(1)抽象类的出现,相当于给编译器加上了一层校验。

(2)原因:当子类继承父类时,编译器都会提醒编译器需要重新抽象方法(为后面的多态打下基础)

3.抽象类与普通类的对比

类/异同普通类抽象类
构造方法
普通成员变量
普通成员方法
抽象方法
实例化允许不允许

二、接口

接口就是抽象类的进一步抽象。接口也是一组公共的规范,如果需要使用接口,就需要蹲守接口的一系列规范

1.接口的简单使用

1.1.生活接口举例

如:电脑的USB口,只要符合该接口的规范,就可以插入;又如:电源插座插孔,符号其规范就可以插入,像电脑、电视机、电饭煲等等符合规范的设备

1.2.接口的语法

(1)和定义类进行类比,定义接口只需要把class关键字替换成 interface 即可

(2)定义接口位置

 

这种定义方式只需要输入接口名字就可以生成接口;如果不选择也可以,但是要自己定义interface+接口名字的形式去定义。

以上就定义好了两个接口,接口中的成员方法和成员变量下面接着讲解。


1.3.接口的成员变量与方法

(1)成员变量

以上原因是什么呢?我们使用idea的功能:Alt+Ins可以生成解决方案

原来是要先赋值,那原因是什么呢?变量初始化时必须赋值的指明该变量被final修饰,不能被修改。

接口中的成员变量特点:

默认被public static final修饰

去掉后

所以,成员变量初始化必须要赋值。定义格式:类型+变量名 = 值

(2)成员方法

显示报错,提示说抽象方法不能被实现

这样就不会再报错,并且没有具体实现的方法,不应该加上abstract修饰吗?看上面,pubblic字体暗了,说明接口的方法默认都是:public abstract修饰的 

那接口的成员方法一定不能被实现吗?那倒未必。

1)被static修饰的方法可以被实现

2)被default修饰的成员方法可以实现

default一般是默认的修饰符,也就是不写的时候,但是这里是必须要显示的写出default

1.4.接口的实现

(1)接口不能实例化

接口和抽象类都是不能直接实例化的,所以需要借助子类来完成实例化

(2)子类继承接口

继承接口要使用implements关键字,而不是extends 

上面显示报错,因为继承父类的抽象方法需要子类重写

子类实例化

但是一般都不会这样使用接口

以上粗略介绍了接口的一些定义、定义内容、和实现的写法,下面先介绍接口的特性,也就是接口的特点。

2.接口的特性

2.1.关于接口的定义

(1)接口定义的时候要使用 interface 关键字来定义

(2)接口中的成员变量,默认都是 public  static final 修饰的;所以定义成员变量的格式为:类型+变量名字 = 初始值;

(3)接口中的成员方法没有实现时,都默认是抽象方法;也就是成员方法默认是 public abstract 修饰的,所以定义成员方法的格式:返回值类型 + 方法名字();

(4)成员方法如果要实现,必须被static 或者 default 修饰

(5)接口名字命名推荐:首字母用大写I,后面跟上接口名字,接口名字首字母也大写

2.2.接口的继承和实现

(1)接口是不能被实例化的

(2)当一个类实现接口的时候,需要使用implements关键字,并且实现之后,要重写接口中的抽象方法

(3)一个类可以实现多个接口(解决了Java中不能多继承的缺点)

(4)继承和实现的顺序:继承类要在实现接口的前面。一个类可以继承一个普通类/抽象类 同时还可以实现多个接口

(5)接口当中不能有静态代码块和构造方法

(6)重写接口当中的抽方法时,只能使用默认的访问权限

(7)接口的生成的字节码文件后缀也是.class

3.接口的使用案例

(1)三个接口

(2)一个抽象类

(3)子类1继承实现

子类2:

(4)main方法实现

运行结果: 

(5)代码

public abstract class Animal {public String name;public Animal(String name) {this.name = name;}public void eat() {System.out.println(this.name+"正在吃");}
}
class Dog extends Animal implements IRun,ISwim {public Dog(String name) {super(name);}@Overridepublic void eat() {System.out.println(this.name+"正在吃狗粮");}@Overridepublic void run() {System.out.println(this.name+"正在用四条腿跑……");}@Overridepublic void swim() {System.out.println(this.name+"正在用四条腿游泳……");}
}
class Duck extends Animal implements IRun,ISwim,IFly {public Duck(String name) {super(name);}@Overridepublic void eat() {System.out.println(this.name+"正在吃鸭粮");}@Overridepublic void run() {System.out.println(this.name+"正在用两个脚跑……");}@Overridepublic void swim() {System.out.println(this.name+"正在用两条腿游泳……");}@Overridepublic void fly() {System.out.println(this.name+"正在用两个翅膀飞……");}
}
public interface IRun {void run();
}
public interface IFly {void fly();
}
public interface ISwim {void swim();
}
public class Test {public static void eat(Animal animal) {animal.eat();}public static void fly(IFly fly) {fly.fly();}public static void main(String[] args) {Dog dog = new Dog("旺财");Duck duck = new Duck("唐老鸭");eat(dog);eat(duck);fly(duck);}
}

4.接口和抽象类的异同

4.1.相同点

(1)都有抽象方法

(2)都不能实例化对象

4.2.不同点

(1)抽象类中可以包含普通方法和普通字段,这些普通方法和普通字段在子类中可以直接使用,不必重写;但是接口中不能包含普通方法,子类必须重写所有的抽象方法

(2)一个普通类只能继承一个抽象类,但是可以实现多个接口


以上就是抽象类和接口的全部内容了。

相关文章:

抽象类和接口的简单认识

目录 一、抽象类 1.什么是抽象类 2.抽象类的注意事项 3.抽象类与普通类的对比 二、接口 1.接口的简单使用 2.接口的特性 3.接口的使用案例 4.接口和抽象类的异同 一、抽象类 所谓抽象类,就是更加抽象的类,也就是说,这个类不能具体描…...

python-pytorch获取FashionMNIST实际图片标签数据集

在查看pytorch官方文档的时候,在这里链接中https://pytorch.org/tutorials/beginner/basics/data_tutorial.html的Creating a Custom Dataset for your files章节,有提到要自定义数据集,需要用到实际的图片和标签。 在网上找了半天没找到&a…...

深入探秘Python生成器:揭开神秘的面纱

一、问题起源: 想象一下,您掌握了一种魔法,在代码世界里,您可以轻松呼唤出一个整数。然而,事情并不总是看起来那样简单。在Python的奇妙王国中,我遇到了一个有趣的谜题: def tst():try:print(…...

红队攻防渗透技术实战流程:红队目标信息收集之批量信息收集

红队资产信息收集 1. 自动化信息收集1.1 自动化信息收集工具1.2 自动域名转换IP工具1.3 自动企业信息查询工具1.4 APP敏感信息扫描工具1.5 自动化信息工具的使用1.5.1 资产灯塔系统(ARL)1.5.1.1 docker环境安装1.2.2.9.1 水泽-信息收集自动化工具1. 自动化信息收集 1.1 自动化…...

【vue3学习笔记(二)】(第141-143节)初识setup;ref函数_处理基本类型;ref函数_处理对象类型

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 本篇内容对应课程第141-143节 课程 P141节 《初识setup》笔记 1、setup是所有组合式API“表演的舞台”,组件中所用到的所有数据、方法、监视数据、生命周期钩子等都需要配置在setup中。 2、setup的两种返回值&…...

若依框架学习使用

若依官网项目拉取下来介绍 | RuoYi 项目运行: 1.idea安装,可以运行前后端 编辑器idea、jdk环境安装、数据库mysql、navicat工具、redis(redis-server启动)安装 2.navicat数据库连接, 创建数据库ry-vue并导入数据脚本ry_2021xxxx.sql,qua…...

蓝桥杯_数学模板

1.试除法判定质数 #include <iostream> using namespace std;bool is_zs(int x) {if(x<2) return false;for(int i2;i<x/i;i)if(x%i0)return false;return true; }int main() {int n; cin>>n;while(n--){int x; cin>>x;if(is_zs(x)) cout<<&quo…...

稀碎从零算法笔记Day31-LeetCode:接雨水

半月一去&#xff0c;望舒一轮&#xff0c;明天开始攻坚哈德题了 前言&#xff1a;非常经典的一道笔试题&#xff0c;看了保证血赚&#xff08;今天银泰星笔试第四题就是这个&#xff09; 题型&#xff1a;dp、模拟、双指针…… 链接&#xff1a;42. 接雨水 - 力扣&#xff…...

微前端的使用和注意事项 - qiankun

一、为什么使用微前端 微前端架构旨在解决单体应用在一个相对长的时间跨度下&#xff0c;由于参与的人员、团队的增多、变迁&#xff0c;从一个普通应用演变成一个巨石应用(Frontend Monolith)后&#xff0c;随之而来的应用不可维护的问题。微前端的核心目标是将巨石应用拆解成…...

uniapp微信小程序消息订阅详解

一、微信公众平台申请订阅模板 注意&#xff1a;订阅信息 这个事件 是 当用户 点击的时候触发 或者 是 支付成功后触发&#xff0c; 用户勾选 “总是保持以上选择&#xff0c;不再询问” 之后或长期订阅&#xff0c;下次订阅调用 wx.requestSubscribeMessage 不会弹窗&#xf…...

git 查看文件夹结构树

在Git中&#xff0c;没有直接的命令可以像文件系统那样展示一个可视化的文件结构树。但是&#xff0c;你可以使用一些外部工具或命令来达到这个目的。 以下是一些方法&#xff0c;你可以使用它们来查看Git仓库的文件结构树&#xff1a; 使用tree命令&#xff08;如果你的系统已…...

设计模式一详解

一、观察者模式 当一个对象状态发生改变时&#xff0c;依赖它的对象全部会收到通知&#xff0c;并自动更新 场景&#xff1a;一个事件发生后&#xff0c;要执行一连串更新操作。传统的编程方式&#xff0c;就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后&#x…...

python 进程、线程、协程基本使用

1、进程、线程以及协程【1】进程概念【2】线程的概念线程的生命周期进程与线程的区别 【3】协程(Coroutines) 2、多线程实现【1】threading模块【2】互斥锁【3】线程池【4】线程应用 3、多进程实现4、协程实现【1】yield与协程【2】asyncio模块【3】3.8版本【4】aiohttp 1. 并发…...

SQLite3进行数据库各项常用操作

目录 前言1、SQLite介绍2、通过SQLite创建一个数据库文件3、往数据库文件中插入数据4、数据库文件信息查询5、修改数据库中的内容6、删除数据库中的内容 前言 本文是通过轻量化数据库管理工具SQLite进行的基础操作和一些功能实现。 1、SQLite介绍 SQLite是一个广泛使用的嵌入…...

Debian GNU/Linux 安装docker与docker compose

安装 Docker 更新包列表 sudo apt update 安装必要的软件包&#xff0c;以便让 APT 可以通过 HTTPS 使用存储库&#xff1a; sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common 添加 Docker 的官方 GPG 密钥&#xff1a; cu…...

图片标注编辑平台搭建系列教程(2)——fabric.js简介

文章目录 综述数据管理图形渲染图形编辑事件监听预告 综述 fabric提供了二维图形编辑需要的所有基础能力&#xff0c;包括&#xff1a;数据管理、图形渲染、图形编辑和事件监听。其中&#xff0c;图形编辑可以通过事件监听和图形渲染来实现&#xff0c;所以可以弃用。数据管理…...

Debian linux版本下运行的openmediavault网盘 千兆网卡升级万兆

一、适用场景 1、使用vmware ESXi虚拟化平台运行多种不同应用服务器时&#xff0c;其中网盘服务器采用开源的openmediavault搭建&#xff1b; 2、将老专业服务器升级千兆网为万兆网&#xff1b; 3、需要转移的数据量大的企业或用户&#xff1b; 4、从服务器到服务器的数据转移…...

前端 CSS 经典:grid 栅格布局

前言&#xff1a;Grid 布局是将容器划分成"行"和"列"&#xff0c;产生单元格&#xff0c;然后将"项目"分配给划分好的单元格&#xff0c;因为有行和列&#xff0c;可以看作是二维布局。 一 术语 1. 容器 采用网格布局的区域&#xff0c;也就是…...

多输入多输出通道

文章目录 图像卷积填充和步幅填充步幅 多输入多输出通道1x1卷积层 图像卷积 卷积原理: 就是将之前的大的图片,定义一个核函数,然后经过移动并运算将图片变小了.也就是将图像压缩提取整合特征值. 这里利用的时乘法. 填充和步幅 填充 在应用多层卷积时&#xff0c;我们常常…...

http响应练习—在服务器端渲染html(SSR)

一、什么是服务器端渲染&#xff08;SSR&#xff09; 简单说&#xff0c;就是在服务器上把网页生成好&#xff0c;整个的HTML页面生成出来&#xff0c;生成出的页面已经包含了所有必要的数据和结构信息&#xff0c;然后直接发给浏览器进行展现。 二、例题 要求搭建http服务&a…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...