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

day19_抽象类丶接口

由来

当我们声明一个几何图形类:圆、矩形、三角形类等,发现这些类都有共同特征:求面积、求周长、获取图形详细信息。那么这些共同特征应该抽取到一个公共父类中。但是这些方法在父类中又无法给出具体的实现,而是应该交给子类各自具体实现。那么父类在声明这些方法时,就只有方法签名,没有方法体,我们把没有方法体的方法称为抽象方法。Java语法规定,包含抽象方法的类必须是抽象类

抽象类的语法格式

特点:没有方法体且被abstract修饰的方法

抽象方法的语法格式  

特点:抽象方法没有方法体 ,且被abstract关键字修饰

注意事项

关于抽象类的使用,以下为语法上要注意的细节,虽然条目较多,但若理解了抽象的本质,无需死记硬背。

  1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。

    理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。

  2. 抽象类中,也有构造方法,是供子类创建对象时,初始化父类成员变量使用的。

    理解:子类的构造方法中,有默认的super()或手动的super(实参列表),需要访问父类构造方法。

  3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

    理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。

  4. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。

    理解:假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有意义。

代码示例

定义抽象类

//抽象类
public abstract class Anima {//类中成员变量private String name;//抽象类中,也有构造方法,是供子类创建对象时,初始化父类成员变量使用的。public Anima(String name) {this.name = name;}public Anima() {}//成员方法public String getName() {return name;}public void setName(String name) {this.name = name;}//抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。public abstract void eat();
}

 定义实现类

public class Dog extends Anima{public Dog(String name) {super(name);}public Dog() {}@Override//抽象类的子类,必须重写抽象父类中所有的抽象方法,除非该子类也是抽象类。 public void eat() {System.out.println("狗狗吃骨头");}
}

定义测试类

public class Test {public static void main(String[] args) {// Anima anima = new Anima();抽象类不能创建对象//只能创建其非抽象子类的对象。Dog dog = new Dog("大黄");dog.eat();//狗狗吃骨头System.out.println(dog.getName());//大黄}
}

接口

由来

电脑边上提供了USB插槽,这个插槽遵循了USB的规范,只要其他设备也是遵循USB规范的,那么就可以互联,并正常通信。至于这个电脑、以及其他设备是哪个厂家制造的,内部是如何实现的,我们都无需关心。

这种设计是将规范和实现分离,这也正是Java接口的好处。Java的软件系统会有很多模块组成,那么各个模块之间也应该采用这种面相接口的低耦合,为系统提供更好的可扩展性和可维护性。

接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要...则必须能...”的思想。继承是一个"是不是"的is-a关系,而接口实现则是 "能不能"的has-a关系。理解:接口是从多个相似类中抽象出来的规范,不需要提供具体实现

  • 例如:你能不能用USB进行连接,或是否具备USB通信功能,就看你是否遵循USB接口规范
  • 例如:Java程序是否能够连接使用某种数据库产品,那么要看该数据库产品有没有实现Java设计的JDBC规范

为什么接口中只能声明公共的静态的常量?

  • 因为接口是标准规范,在规范中需要声明一些底线边界值,当实现者在实现这些规范时,不能去随意修改和触碰这些底线,否则就有“危险”。

接口的定义,它与定义类方式相似,但是使用 interface关键字。它也会被编译成.class文件,但一定要明确接口并不是类,而是另外一种引用数据类型。

接口中可以声明什么?

JDK8之前,接口中只允许出现:

  • 公共的静态的常量:其中public static final可以省略。
  • 公共的抽象的方法:其中public abstract可以省略
//定义接口
public interface Fly {//公共的静态的常量:其中public static final可以省略String name = "示例代码";// 公共的抽象的方法:其中public abstract可以省略void fly();
}

JDK1.8时,接口中允许声明默认方法和静态方法:

  • 公共的默认的方法:其中public 可以省略,建议保留,但是default不能省略。
    • 我们要在已有的老版接口中提供新方法时,如果添加抽象方法,就会涉及到原来使用这些接口的类就会有问题,那么为了保持与旧版本代码的兼容性,只能允许在接口中定义默认方法实现。比如:Java8中对Collection、List、Comparator等接口提供了丰富的默认方法。
    • 当我们接口的某个抽象方法,在很多实现类中的实现代码是一样的,此时将这个抽象方法设计为默认方法更为合适,那么实现类就可以选择重写,也可以选择不重写。
    • 重写时,default单词就不要再写了,它只用于在接口中表示默认方法,到类中就没有默认方法的概念了
  • 公共的静态的方法:其中public 可以省略,建议保留,但是static不能省略。之前的标准类库设计中,有很多Collection/Colletions或者Path/Paths这样成对的接口和类,后面的类中都是静态方法,而这些静态方法都是为前面的接口服务的,那么这样设计一对API,不如把静态方法直接定义到接口中使用和维护更方便
//定义接口
public interface Fly {//默认方法public default void start(){System.out.println("默认方法");}//静态方法public static void show(){System.out.println("静态方法");}
}

JDK1.9时,接口又增加了:

  • 私有方法:因为有了默认方法和静态方法这样具有具体实现的方法,那么就可能出现多个方法由共同的代码可以抽取,而这些共同的代码抽取出来的方法又只希望在接口内部使用,所以就增加了私有方法。

除此之外,接口中不能有其他成员,没有构造器,没有初始化块,因为接口中没有成员变量需要初始化。

接口的声明格式

实现接口

接口的使用,它不能创建对象,但是可以被实现(implements,类似于被继承)。类与接口的关系为实现关系,即类实现接口,该类可以称为接口的实现类,也习惯称为接口的子类(严格来说,实现类不是子类)。实现的动作类似继承,格式相仿,只是关键字不同,实现使用 implements关键字。

注意:实现类不能继承接口中的静态方法和私有方法

实现接口语法格式

如何调用对应的方法

  • 对于接口的静态方法,直接使用“接口名.”进行调用即可。也只能使用“接口名."进行调用,不能通过实现类的对象进行调用

  • 对于接口的抽象方法、默认方法,只能通过实现类对象才可以调用。接口不能直接创建对象,只能创建实现类的对象

代码示例

定义接口

//定义接口
public interface LiveAble {// 定义抽象方法public abstract void eat();public abstract void breathe();//定义默认方法public default void sleep(){System.out.println("静止不动");}//定义静态方法public static void drink(){System.out.println("喝水");}
}

定义实现类Animal

public class Animal implements LiveAble{//重写/实现接口的抽象方法@Overridepublic void eat() {System.out.println("吃东西");}//重写/实现接口的抽象方法@Overridepublic void breathe(){System.out.println("吸入氧气呼出二氧化碳");}//重写接口的默认方法@Overridepublic void sleep() {System.out.println("闭上眼睛睡觉");}
}

定义实现类Plant

public class Plant implements LiveAble {//重写/实现接口的抽象方法@Overridepublic void eat() {System.out.println("吸收营养");}//重写/实现接口的抽象方法@Overridepublic void breathe(){System.out.println("吸入二氧化碳呼出氧气");}
}

定义测试类

public class Test {public static void main(String[] args) {// 创建实现类(子类)对象Animal a = new Animal();// 调用实现后的方法a.eat(); //吃东西a.sleep(); //闭上眼睛睡觉a.breathe(); //吸入氧气呼出二氧化碳//创建实现类(子类)对象Plant p = new Plant();p.eat(); //吸收营养p.sleep(); //静止不动p.breathe(); //吸入二氧化碳呼出氧气//通过接口调用静态方法LiveAble.drink();// Animal.drink();错误,找不到符号// Plant.drink();错误,找不到符号}
}

接口的多实现

在继承体系中,一个类只能继承一个父类。而对于接口而言,一个类是可以实现多个接口的,这叫做接口的多实现。并且,一个类能继承一个父类,同时实现多个接口。

实现格式:

注意事项:

  • 接口中,有多个抽象方法时,实现类如果不是抽象类就必须重写所有抽象方法。如果抽象方法有重名的,只需要重写一次
  • 当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的抽象方法重名,子类就近选择执行父类的成员方法
  • 当一个类同时实现了多个接口,而多个接口中包含方法签名相同的默认方法时,要么选择保留其中一个,通过“接口名.super.方法名"的方法选择保留哪个接口的默认方法,要么选择自己完全重写

接口的多继承

一个接口能继承另一个或者多个接口接口的继承也使用 extends关键字,子接口继承父接口的方法。最底层的实现类(非抽象类)要实现接口里所有的抽象方法,包括接口继承下来的。

定义接口

package sgg1.demo06;
// 父接口
interface A {void a();public default void methodA(){System.out.println("A类默认方法");}
}
// 父接口
interface B {void b();public default void methodB(){System.out.println("B类默认方法");}
}
//子接口
interface C extends A,B{}
//定义实现类
class D implements C{@Overridepublic void a() { //重写a接口的抽象方法System.out.println("重写a接口的抽象方法");}@Overridepublic void b() {//重写b接口的抽象方法System.out.println("重写b接口的抽象方法");}}

定义测试类

public class Test {public static void main(String[] args) {D d = new D();d.a(); //重写a接口的抽象方法d.b(); //重写b接口的抽象方法d.methodA(); //A类默认方法d.methodA(); //A类默认方法}
}

  接口与实现类对象的多态引用

实现类实现接口,类似于子类继承父类,因此,接口类型的变量与实现类的对象之间,也可以构成多态引用。通过接口类型的变量调用方法,最终执行的是你new的实现类对象实现的方法体。

public class TestInterface {public static void main(String[] args) {Flyable b = new Bird();b.fly(); //展翅高飞Flyable k = new Kite();k.fly(); //别拽我,我要飞}
}
interface Flyable{//抽象方法void fly();
}
class Bird implements Flyable{@Overridepublic void fly() {System.out.println("展翅高飞");}}
class Kite implements Flyable{@Overridepublic void fly() {System.out.println("别拽我,我要飞");}}

相关文章:

day19_抽象类丶接口

由来 当我们声明一个几何图形类:圆、矩形、三角形类等,发现这些类都有共同特征:求面积、求周长、获取图形详细信息。那么这些共同特征应该抽取到一个公共父类中。但是这些方法在父类中又无法给出具体的实现,而是应该交给子类各自…...

【网安神器篇】——系统指纹探测工具finger

作者名:白昼安全主页面链接: 主页传送门创作初心: 以后赚大钱座右铭: 不要让时代的悲哀成为你的悲哀专研方向: web安全,后渗透技术每日鸡汤: 我不想停下,因为这次出发的感觉太好了一…...

Prometheus离线tar包安装

Prometheus离线tar包安装实验环境一、部署前操作二、Master2.1下载2.2解压2.3更改服务目录名称2.4创建系统服务启动文件2.5配置修改2.6启动并设置开机自启2.7访问2.8添加node节点2.8.1 添加方法2.8.2修改Prometheus配置(Master)————————————…...

PostgreSQL查询引擎——SELECT STATEMENTS SelectStmt

SelectStmt: select_no_parens %prec UMINUS| select_with_parens %prec UMINUS select_with_parens:( select_no_parens ) { $$ $2; }| ( select_with_parens ) { $$ $2; } 该规则返回单个SelectStmt节点或它们的树,表示集合操作树(set-operation tree…...

零信任-易安联零信任介绍(11)

​目录 ​易安联零信任公司介绍 易安联零信任发展路线 易安联零信任产品介绍 易安联零信任架构 易安联零信任解决方案 易安联零信任发展展望 易安联零信任公司介绍 易安联是一家专业从事网络信息安全产品研发与销售,是行业内领先的“零信任”解决方案提供商&…...

C++ STL——map和set的使用

文章目录1. 关联式容器1.1 键值对1.2 树形结构的关联式容器2. set2.1 set的介绍2.2 set的插入2.3 set的删除和查找2.4 lower_bound和upper_bound3. multiset3.1 count4. map4.1 map的介绍4.2 map的插入4.3 map的遍历4.4 map的[ ]5. multimap1. 关联式容器 我们之前学的vector、…...

【Python】thread使用

目录1、Condition条件变量使用2、event通信3、Semaphore信号量使用4、setDaemon设置守护线程5、threadPool_map使用6、threadPool使用7、threadingTimer1、Condition条件变量使用 # encoding:utf-8 Condition 提供了一种多线程通信机制, 假如线程 1 需要数据&#…...

计网传输层协议:UDP和TCP

文章目录一. 应用层和传输层的联系二. UDP协议三. TCP协议1. TCP报头介绍2. TCP实现可靠传输的核心机制2.1 确认应答2.2 超时重传3. 连接管理(三次握手, 四次挥手)3.1 建立连接(三次握手)3.2 断开连接(四次挥手)4. 滑动窗口5. 流量控制6.拥塞控制7. 延时应答8. 捎带应答9. 面向…...

一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例

文章目录1 Socket讲解2 基于Socket的TCP编程3 客户端Socket的工作过程包含以下四个基本的步骤3.1 客户端创建Socket对象4 服务器程序的工作过程包含以下四个基本的步骤:4.1 服务器建立ServerSocket对象5 案例实现 客户端和服务端通信5.1 代码实现5.2 实现结果6 更多…...

Java中print和println的区别

1 问题在最开始学习Java的时候学到soutenter键可以输出结果,显示的是System.out.println();而在Python中是直接使用print。那么在Java中print和println有什么区别?2 方法Print输出会自动将括号中的内容转换成字符串输出,如果括号中…...

RocketMq使用规范(纯技术和实战建议)

概述: 使用规范主要从,生产、可靠性、和消费为轴线定义使用规范;kafka使用核心:削峰、解耦、向下游并行广播通知(无可靠性保证)和分布式事务,本规范仅从削峰、解耦、向下游并行广播通知论述&am…...

matlab离散系统仿真分析——电机

目录 1.电机模型 2.数字PID控制 3.MATLAB数字仿真分析 3.1matlab程序 3.2 仿真结果 4. SIMULINK仿真分析 4.1simulink模型 4.2仿真结果 1.电机模型 即: 其中:J 0.0067;B 0.10 2.数字PID控制 首先我们来看一下连续PID&#xff1…...

一文学会进程控制

目录进程的诞生fork函数fork的本质fork的常规用法fork调用失败的原因进程的死亡进程退出的场景常见的进程退出方法正常终止(代码跑完)echo $?main函数返回调用exit调用_exitexit和_exit的区别进程等待进程等待的重要性进程等待的函数waitwaitpid进程退出…...

5.2 BGP水平分割

5.2.2实验2&#xff1a;BGP水平分割 1. 实验目的 熟悉BGP水平分割的应用场景掌握BGP水平分割的配置方法 2. 实验拓扑 实验拓扑如图5-2所示&#xff1a; 图5-2&#xff1a;BGP水平分割 3. 实验步骤 &#xff08;1&#xff09;配置IP地址 R1的配置 <Huawei>…...

华为OD机试 - TLV 编码 | 备考思路,刷题要点,答疑 【新解法】

最近更新的博客 【新解法】华为OD机试 - 关联子串 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 停车场最大距离 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 任务调度 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试…...

【C语言每日一题】——猜名次

【C语言每日一题】——猜名次&#x1f60e;前言&#x1f64c;猜名次&#x1f64c;解题思路分享&#xff1a;&#x1f60d;解题源码分享&#xff1a;&#x1f60d;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神…...

Agilent E4982A、Keysight E4982A、LCR 表,1 MHz 至 3 GHz

Agilent E4982A、Keysight E4982A、HP E4982A LCR 表&#xff0c;1 MHz 至 3 GHz 产品概览 KEYSIGHT E4982A&#xff08;安捷伦&#xff09; Keysight E4982A LCR 表为需要高频&#xff08;1 MHz 至 3 GHz&#xff09;阻抗测试的无源元件制造行业提供一流的性能&#xff0c…...

SAP 系统的配置传输

在SAP项目的实施过程中&#xff0c;经常会遇到关于配置传输的问题。即我们在某个client下面做系统配置&#xff0c;配好了之后再传到其他系统之中。 配置传输分为两种情况&#xff1a;同服务器配置传输&#xff0c;异服务器配置传输。同服务器配置传输&#xff1a; 在DEV配置cl…...

华为OD机试 - 喊七(Python)

喊七 题目 喊 7,是一个传统的聚会游戏, N 个人围成一圈,按顺时针从1 - 7编号, 编号为1的人从1开始喊数, 下一个人喊得数字是上一个人喊得数字+1, 但是当将要喊出数字7的倍数或者含有7的话, 不能喊出,而是要喊过。 假定N个人都没有失误。 当喊道数字k时, 可以统计每…...

Docker下快速搭建RabbitMQ单例及集群

引子生命在于折腾&#xff0c;为上数据实时化用到了消息传送的内容&#xff0c;当时也和总公司人员商量选型&#xff0c;kafka不能区分分公司就暂定用了RbtMQ刚好个人也在研究容器及分布式部署相关内容就在docker上实践单机 docker&#xff08;要想快 先看问题 避免踩坑&#x…...

python代码写开心消消乐

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真情 目录 一.python是什么 二.游戏代码效果呈现 三.主代...

【郭东白架构课 模块一:生存法则】09|法则四:为什么要顺应技术的生命周期?

你好&#xff0c;我是郭东白。今天我们来讲架构师的第四条生存法则&#xff0c;那就是尊重技术的生命周期。 人类的各种活动都要遵循事物的客观生命周期。不论是农业社会种田打渔&#xff0c;还是资本社会投资创业&#xff0c;行动太早或太晚&#xff0c;都会颗粒无收。技术也…...

Linux之进程控制

一.进程创建 1.1 fork函数 我们创建进程的方式有./xxx和fork()两种 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程…...

SpringBoot社区版专业版带你配置热部署

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 SpringBoot社区版专业版带你配置热部署 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1…...

影响AFE采样精度的因素有哪些?

**AFE&#xff08;Analog Front End&#xff09;**是模拟前端电路的缩写&#xff0c;它是模拟信号传感器和数字信号处理器之间的连接点。AFE采样精度是指模拟信号被数字化后的准确度&#xff0c;对于很多电子设备来说&#xff0c;这是一个至关重要的性能指标。本文将介绍影响AF…...

mysqlbackup备份报error:redo log was overwritten

问题原因 备份时redo log被覆盖 解决方案 方法1&#xff1a;增加innodb_log_file_size、innodb_log_files_in_group大小&#xff0c;需要重启数据库 vi my.cnf innodb_log_file_size 2G innodb_log_files_in_group 4 方法2: 动态配置redo log archive&#xff0c;不需要重启…...

Android支持库

# 支持库 注意:Android 9.0(API 级别 28)发布后,新版支持库 AndroidX 也随之诞生,它属于 Jetpack。除了现有的支持库,AndroidX 库还包含最新的 Jetpack 组件。 您可以继续使用此支持库以往的工件(这里指的是版本 27 及更早版本,且已打包为 android.support.*)在 Googl…...

Vue:filters过滤器

日期、时间格式化是Vue前端项目中较为常遇到的一个需求点&#xff0c;此处&#xff0c;围绕Vue的过滤器来介绍如何更为优雅的解决此类需求。 过滤器filters使用注意点 Vue允许开发者自定义过滤器&#xff0c;可以实现一些常见的文本格式化等需求。 使用时要注意的点在于&#…...

Windows环境下安装和配置Gradle

1. 概述 Gradle是Google公司基于JVM开发的一款项目构建工具&#xff0c;支持Maven&#xff0c;JCenter多种第三方仓库&#xff0c;支持传递性依赖管理&#xff0c;使用更加简洁和支持多种语言的build脚步文件&#xff0c;更多详情可以参阅Gradle官网 2. 下载 由于Gradle与S…...

数据结构时间空间复杂度笔记

&#x1f57a;作者&#xff1a; 迷茫的启明星 本篇内容&#xff1a;数据结构时间空间复杂度笔记 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;家人们&#xff0c;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤…...

如何做同城信息网站/网站搭建需要什么

文章目录文章参考获取dom节点高宽的通用方法案例说明getBoundingClientRect() 获取DOM 的高度和宽度的办法&#xff1f;文章参考 原生js操作dom添加删除替换class你了解getBoundingClientRect&#xff08;&#xff09;&#xff1f; 获取dom节点高宽的通用方法 dom.style.widt…...

泰国购物网站大全/百度发广告怎么发

WinForm窗体生命周期 1,窗体启动时: Control.HandleCreatedControl.BindingContextChangedForm.LoadControl.VisibleChangedForm.ActivatedForm.Shown 2,窗体关闭时:Form.ClosingForm.FormClosingForm.ClosedForm.FormClosedForm.Deactivate 3,控件焦点与验证事件: EnterGotFoc…...

mac怎么升级wordpress/seo技巧分享

经常更换wordpress主题&#xff0c;会有一个困扰&#xff0c;就是之前主题的内容区域宽度比较大&#xff0c;很多正文图片的尺寸可能是500px,而换了一个主题&#xff0c;内容区域的宽度比较小&#xff0c;假设是400px&#xff0c; 这时原先的图片宽度都是500px&#xff0c;这样…...

网站首页一般做多大尺寸/百度站长平台工具

目录 1.CPU与GPU分析 1.GPU渲染工具:GPU-RENDERING-PROFILE 2.GPR显示内容说明: 检查 GPU 渲染速度和过度绘制了解设备上的开发者选项如何帮助您直观地查看您的应用可能会在何处遇到问题。https://developer.android.google.cn/topic/performance/rendering/inspect-gpu-rend…...

梅州网站建设/广告推广怎么做

构造函数初始化列表以一个冒号开始&#xff0c;接着是以逗号分隔的数据成员列表&#xff0c;每个数据成员后面跟一个放在括号中的初始化式。例如&#xff1a; class CExample { public:int a;float b;//构造函数初始化列表CExample(): a(0),b(8.8){}//构造函数内部赋值CExampl…...

中国空间站/电商seo是什么意思

macOS的最新版本Big Sur具有许多新功能和改进&#xff0c;我们大多数人都希望尽快安装它。在大多数情况下&#xff0c;一切都会正常进行&#xff0c;因此我们可以快速启动并运行。但是&#xff0c;有时它运行不正常&#xff0c;并且您会看到一条消息&#xff0c;指出无法完成ma…...