抽象类和接口的简单认识

目录

一、抽象类

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)一个普通类只能继承一个抽象类,但是可以实现多个接口


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

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

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

相关文章

动态规划之子序列(三)

583. 两个字符串的删除操作 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。 示例: 输入: “sea”, “eat” 输出: 2 解释: 第一步将"sea"变为"ea"…

论文笔记:GPT-4 Is Too Smart To Be Safe: Stealthy Chat with LLMs via Cipher

ICLR 2024 reviewer评分 5688 1 论文思路 输入转换为密码,同时附上提示,将加密输入喂给LLMLLM输出加密的输出加密的输出通过解密器解密 ——>这样的步骤成功地绕过了GPT-4的安全对齐【可以回答一些反人类的问题,这些问题如果明文问的话&…

Linux 安装Mysql

安装源文件版本:mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz 安装前,我们可以检测系统是否自带安装 MySQL: rpm -qa | grep mysql如有,类似 mysql-libs-5.1.52-1.el6_0.1.x86_64那可以选择进行卸载: rpm -e mysql-libs-5.1.52-1.el6_0.1…

云备份项目认识、环境搭建以及所使用的库的介绍

一、云备份认识 将本地计算机一个受监管的文件夹的文件上传到服务器中,有服务器组织,客户端可以通过网页将文件查看并且下载下来,下载过程支持断点续传功能,并且服务器会对上传的文件进行热点管理,长时间没人访问的文…

AES加密解密算法

一,AES算法概述 AES属于分组加密,算法明文长度固定为128位(单位是比特bit,1bit就是1位,128位等于16字节) 而密钥长度可以是128、192、256位 当密钥为128位时,需要循环10轮完成加密&#xff0…

【最后一天!】2G 50/年 4G 618/3年 京东大厂 云服务器选购建议 搭建网站 数据分析 附最新价格对比表

《最新对比表》已更新在文章头部—腾讯云文档,文章具有时效性,请以腾讯文档为准! 【腾讯文档实时更新】云服务器1分钟教会你如何选择教程 2024-开年采购活动 云服务器专区 京东云 阿里云 腾讯云 配置最新价格表 与 官方活动地址 ​ 当前活动…

idea中Git项目遇到“Filename too long”错误 与 配置Git的ssh证书

一:“Filename too long”问题解决办法 错误信息: fatal: cannot create directory at xxxx: Filename too long warning: Clone succeeded, but checkout failed. You can inspect what was checked out with git status and retry with git restore …

CXL系统架构

CXL系统架构 CXL支持三种设备类型,如下图。Type 1支持CXL.cache和CXL.io;Type 2支持CXL.cache,CXL.mem和CXL.io;Type 3支持CXL.mem和CXL.io。无论哪种类型,CXL.io都是不可缺少的,因为设备的发现&#xff0…

正则表达式 vs. 字符串处理:解析优势与劣势

title: 正则表达式 vs. 字符串处理:解析优势与劣势 date: 2024/3/27 15:58:40 updated: 2024/3/27 15:58:40 tags: 正则起源正则原理模式匹配优劣分析文本处理性能比较编程应用 1. 正则表达式起源与演变 正则表达式(Regular Expression)最早…

MES_ENT_STD

生产执行系统(企业标准版)MES_ENT_STD ERP_ENT_STD_59438.ieqq.ent-CSDN博客 OAMS_ENT_STD-CSDN博客

爬虫(Web Crawler)介绍与应用

## 摘要 本文将介绍什么是爬虫(Web Crawler)以及其在信息抓取、数据分析等领域的应用。我们将深入探讨爬虫的工作原理、设计特点以及开发过程中需要考虑的关键问题。 ## 一、什么是爬虫 爬虫是一种自动化程序或脚本,用于从互联网上抓取信息…

主流公链 - Monero

Monero: 加密货币的隐私标杆 1. 简介 Monero(XMR),世界语中货币的意思,是一种去中心化的加密货币,旨在提供隐私和匿名性。与比特币等公开区块链不同,Monero专注于隐私保护,使用户的交易记录和余…

CI/CD实战-jenkins结合ansible 7

配置主机环境 在jenkins上断开并删除docker1节点 重新给master添加构建任务 将server3,server4作为测试主机,停掉其上后面的docker 在server2(jenkins)主机上安装ansible 设置jenkins用户到目标主机的免密 给测试主机创建用户并…

MySQL InnoDB 之 多版本并发控制(MVCC)

多版本并发控制(MVCC,Multi-Version Concurrency Control)是数据库管理系统中用于提供高并发性和在事务处理中实现隔离级别的一种技术。MVCC 允许系统在不完全锁定数据库资源的情况下,处理多个并发事务,从而提高了数据…

计算机网络:物理层 - 信道复用

计算机网络:物理层 - 信道复用 频分复用时分复用统计时分复用波分复用码分复用 计算机网络中,用户之间通过信道进行通信,但是信道是有限的,想要提高网络的效率,就需要提高信道的利用效率。因此计算机网络中普遍采用信道…

循序渐进丨MogDB 对 Oracle DBLink兼容性增强

本特性自 MogDB 5.0.0版本开始引入,支持 Oracle DBLink语法,可以使用符号访问 Oracle 数据库中的表。 示 例 01 环境准备 MogDB 环境 已安装 MogDB 数据库。已安装oracle_fdw插件,具体安装方法参见oracle_fdw安装文档https://docs.mogdb.io/…

【博弈论3——二人博弈的纳什均衡】

1.俾斯麦海之战 2. 零和博弈的定义 零和博弈(Zero-Sum Game)是一种博弈论的基本概念,指的是在博弈过程中,博弈参与者之间的收益和损失之和总是一个常数,特别是总和为零。即博弈一方的收益必然等于另一方的损失&#x…

软考 - 系统架构设计师 - 关系模型的完整性规则

前言 关系模型的完整性规则是一组用于确保关系数据库中数据的完整性和一致性的规则。这些规则定义了在关系数据库中如何存储、更新和查询数据,以保证数据的准确性和一致性。 详情 关系模型的完整性规则主要包括以下三类: 实体完整性规则 这是确保每个…

【3D目标检测】Det3d—SE-SSD模型训练(前篇):KITTI数据集训练

SE-SSD模型训练 1 基于Det3d搭建SE-SSD环境2 自定义数据准备2.1 自定义数据集标注2.2 训练数据生成2.3 数据集分割 3 训练KITTI数据集3.1 数据准备3.2 配置修改3.3 模型训练 1 基于Det3d搭建SE-SSD环境 Det3D环境搭建参考:【3D目标检测】环境搭建(OpenP…

企业交换组网之VLAN

1. 企业内网有哪些安全隐患? 2. VLAN如何进行业务隔离?二层VLAN交换 3. 思科华为双厂商VLAN部署区别; --- VLAN - 虚拟局域网 --- 虚拟局域网:通过交换机连接的网络 - 把终端连接在一起 实现内网互通 共享文件夹&#xf…