【JAVA入门】Day15 - 接口
【JAVA入门】Day15 - 接口
文章目录
- 【JAVA入门】Day15 - 接口
- 一、接口是对“行为”的抽象
- 二、接口的定义和使用
- 三、接口中成员的特点
- 四、接口和类之间的关系
- 五、接口中新增的方法
- 5.1 JDK8开始接口中新增的方法
- 5.1.1 接口中的默认方法
- 5.1.2 接口中的静态方法
- 5.2 JDK9 开始接口中新增的方法
- 5.2.1 在接口中定义私有方法
- 六、接口的应用
- 七、适配器设计模式
为什么有接口?
众所周知,继承是将子类中的共性抽象提炼到父类中,获取整个体系的共性以节省代码,但是,也存在这样一种情况:某一共性,绝大部分子类都有,但唯独极少部分子类未拥有此特性,那么如果把这个共性写进父类,继承下来,对这些少数子类而言就是不合理的了。
比如:猫和狗都会游泳,但兔子不会,这个时候如果在父类中定义“游泳”的方法,兔子继承是不合理的,但如果猫和狗分别写自己的游泳方法,又有可能发生两个方法书写的格式、命名不一致的情况。因此我们需要定义一个新概念,来约束这两个子类中“游泳”方法的书写规范。此时,我们就可以定义一个“游泳”的接口,在接口里定义抽象方法 swim(),然后让猫和狗与这个接口连接,保证了代码的统一。
综上所述,接口就是一种规则,当我们需要给多个类同时定义规则时,就需要用到接口。
一、接口是对“行为”的抽象
接口不代表一类事物,接口代表的是一种规则,因此接口可以作为参数传递给方法。
“不论来搬家的是货拉,三轮,哪怕是人力,只要他能实现搬家,他就有用”。
搬家(车的对象);
搬家(搬家公司);
public interface 运输 {...
}
public void 搬家(运输的接口 c) {...
}
二、接口的定义和使用
- 接口用关键字 interface 来定义。
public interface 接口名 {}
- 接口不能实例化,也就是说接口不能用来创建对象。
- 接口和类之间是实现关系,通过 implements 关键字表示。
public class 类名 implements 接口名 {}
- 接口的子类(实现类)要么重写接口中的所有抽象方法,要么本身也是一个抽象类。
- 接口和类的实现关系,可以单实现,也可以多实现:
public class 类名 implements 接口名1 , 接口名2 {}
- 实现类可以在继承一个类的同时实现多个接口。
public class 类名 extends 父类 implements 接口名1 , 接口名2 {}
练习:编写带有接口和抽象类的标准 Javabean 类。
青蛙 属性:名字,年龄 行为:吃虫子,蛙泳狗 属性:名字,年龄 行为:吃骨头,狗刨兔子 属性:名字,年龄 行为:吃胡萝卜
先写父类,因为三个字类吃的东西不同,可以把 eat() 定义为抽象方法:
package oopInterface;public abstract class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public abstract void eat();
}
写接口Swim:
package oopInterface;public interface Swim {public abstract void swim();
}
写青蛙类,注意继承父类重写父类的抽象方法,注意实现游泳接口:
package oopInterface;public class Frog extends Animal implements Swim {public Frog() {super();}public Frog(String name, int age) {super(name, age);}@Overridepublic void swim() {System.out.println("青蛙在蛙泳。");}@Overridepublic void eat() {System.out.println("青蛙在吃虫子。");}
}
写狗类,注意继承父类重写父类的抽象方法,实现游泳接口:
package oopInterface;public class Dog extends Animal implements Swim {public Dog(){super();}public Dog(String name, int age) {super(name,age);}@Overridepublic void swim() {System.out.println("狗在狗刨。");}@Overridepublic void eat() {System.out.println("狗在吃骨头。");}
}
写兔子类,注意只需要继承父类重写抽象方法,不需要实现游泳接口(不会游泳):
package oopInterface;public class Rabbit extends Animal {public Rabbit() {}public Rabbit(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("兔子在吃胡萝卜。");}
}
写测试类。
package oopInterface;public class Test {public static void main(String[] args) {Frog f = new Frog("小绿",23);f.eat();f.swim();System.out.println(f.getName() + ", " + f.getAge());Dog d = new Dog("大D", 24);d.eat();d.swim();System.out.println(d.getName() + ", " + d.getAge());Rabbit r = new Rabbit("兔子", 30);r.eat();System.out.println(r.getName() + ", " + r.getAge());}
}
三、接口中成员的特点
- 成员变量:接口中的成员变量只能是常量,默认使用 public static final 修饰(就是不写也自动认为是这样)。
- 构造方法:接口没有构造方法。
- 成员方法:JDK7以前只能是抽象方法,默认修饰符为 public abstract;JDK8以后,接口中可以定义有方法体的方法;JDK9以后,接口中可以定义私有方法。
四、接口和类之间的关系
- 类和类的关系:继承关系——只能单继承,不能多继承,但可以多层继承。
- 类和接口的关系:实现关系——可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。
- 接口和接口的关系:继承关系——可以单继承,也可以多继承。
注意:
1.类在实现接口时,要么实现接口中所有的抽象方法,要么这个类本身也是一个抽象类。
2.类可以多实现接口,如果多实现,需要把所有要实现接口的抽象方法都实现。
3.接口可以多继承,如果一个子接口继承了多个接口,然后被一个实现类实现,那么这个实现类就要把这个子接口和他的所有父接口中的所有抽象方法全部实现。
练习:编写带有接口和抽象类的标准Javabean类。
乒乓球运动员:姓名,年龄,学打乒乓球,说英语
篮球运动员:姓名,年龄,学打篮球
乒乓球教练:姓名,年龄,教打乒乓球,说英语
篮球教练:姓名,年龄,教打篮球
//Person类
package oopInterExp;//因为直接创建顶层父类人的对象是没有意义的
//所以将其写为抽象类
public abstract class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public Person() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
//Sporter类继承Person
package oopInterExp;public abstract class Sporter extends Person {public Sporter(String name, int age) {super(name, age);}public Sporter() {}public abstract void learn();
}
//Coach类继承Person
package oopInterExp;public abstract class Coach extends Person {public Coach() {}public Coach(String name, int age) {super(name, age);}public abstract void teach();
}
//SpeakEnglish接口
package oopInterExp;public interface SpeakEnglishInter {public abstract void speakEnglish();
}
//PingPongSporter继承Sporter,实现SpeakEnglish
package oopInterExp;public class PingPongSporter extends Sporter implements SpeakEnglishInter {public PingPongSporter(String name, int age) {super(name, age);}public PingPongSporter() {}@Overridepublic void learn() {System.out.println("学习乒乓球。");}@Overridepublic void speakEnglish() {System.out.println("乒乓球运动员在说英语。");}
}
//PingPongCoach继承Coach,实现SpeakEnglish
package oopInterExp;public class PingPongCoach extends Coach implements SpeakEnglishInter {public PingPongCoach() {}public PingPongCoach(String name, int age) {super(name, age);}@Overridepublic void teach() {System.out.println("教乒乓球。");}@Overridepublic void speakEnglish() {System.out.println("乒乓球教练在说英语。");}
}
//BasketballSporter继承Sporter
package oopInterExp;public class BasketballSporter extends Sporter {public BasketballSporter(String name, int age) {super(name, age);}public BasketballSporter() {}public void learn() {System.out.println("学篮球。");}
}
//BasketballCoach继承Coach
package oopInterExp;public class BasketballCoach extends Coach {public BasketballCoach() {}public BasketballCoach(String name, int age) {super(name, age);}public void teach() {System.out.println("教篮球。");}
}
五、接口中新增的方法
5.1 JDK8开始接口中新增的方法
JDK7 以前,接口中只能定义抽象方法。
JDK8新增的特性是:接口中可以定义有方法体的方法(可以定义默认方法或静态方法)。
JDK9新增的特性是:接口中可以定义私有方法。
5.1.1 接口中的默认方法
接口中定义有方法体的方法,主要是为了接口升级考虑的,接口不可能是一成不变的,需要往里面添加新的方法来升级,如果这些方法都是抽象方法,此时,实现类中就需要同时也实现这些方法,非常麻烦且不容易同步;倘若升级使用的是有方法体的方法,那么实现类就不需要额外进行修改了,如果需要修改,也可以利用重写进行修改。
- 在接口中定义默认方法,需要使用关键字 default 修饰。
- 格式:public default 返回值类型 方法名(参数列表) { }
- 范例:public default void show() { }
- 默认方法不是抽象方法,不强制需要被重写。但是如果被重写,重写的时候要去掉 default 关键字。
- public 可以省略,但是 default 不可以省略。
- 如果实现了多个接口,多个接口中存在相同名字的默认方法,那么子类就必须对该方法进行重写了(不重写会引起冲突)。
接口Inter1:
package oopInterface5;public interface Inter1 {public abstract void method();public default void default_method() {System.out.println("Inter1接口中的默认方法");}
}
接口Inter2:
package oopInterface5;public interface Inter2 {public default void default_method() {System.out.println("Inter2接口中的默认方法");}
}
两个默认方法同名,如果实现类同时实现这俩接口,一定需要重写这个默认方法!
package oopInterface5;public class InterImpl implements Inter1, Inter2 {@Overridepublic void method() {System.out.println("抽象方法的实现");}@Overridepublic void default_method() {System.out.println("重写接口中的默认方法");}
}
测试类:
package oopInterface5;public class Test {public static void main(String[] args) {InterImpl ii = new InterImpl();ii.method(); //抽象方法的实现ii.default_method(); //重写接口中的默认方法}
}
5.1.2 接口中的静态方法
JDK8 以后允许在接口中定义静态方法,需要用 static 修饰。
接口中静态方法的定义格式为:
- public static 返回值类型 方法名(参数列表) { }
- 范例:public static void show() { }
接口中静态方法的注意事项:
- 静态方法只能通过接口名调用,不能通过实现类名或对象名调用。
- public 可以省略,static 不能省略。
写一个接口:
package oopInterface6;public interface Inter {public abstract void method();public static void static_method() {System.out.println("接口中的静态方法");}
}
写一个实现类,类里面还有一个静态方法,与接口里面的方法同名,但这不是重写,因为静态方法是不能被重写的:
package oopInterface6;public class InteImpl implements Inter {@Overridepublic void method() {System.out.println("重写接口中的抽象方法");}//这不叫重写public static void static_method() {System.out.println("我不是重写的Inter接口中的静态方法");}
}
但其实,二者是不同的方法。
package oopInterface6;public class Test {public static void main(String[] args) {InteImpl ii = new InteImpl();ii.method(); //重写接口中的抽象方法Inter.static_method(); //调用接口中的静态方法InteImpl.static_method(); //调用实现类中的一个同名的静态方法}
}
5.2 JDK9 开始接口中新增的方法
5.2.1 在接口中定义私有方法
- 格式1:private 返回值类型 方法名(参数列表) { }
- 范例1:private void show() { }
- 用法:给默认方法服务。
package oopInterface7;public interface InterA {public default void show1() {System.out.println("show1开始执行");show3();}public default void show2() {System.out.println("show2开始执行");show3();}//普通的私有方法,给默认方法服务的private void show3() {System.out.println("记录程序在运行过程中的各种细节,这里有100行代码。");}
}
- 格式2:private static 返回值类型 方法名(参数列表) { }
- 范例2:private static void method() { }
- 用法:给静态方法服务。
package oopInterface7;public interface InterB {public static void show1() {System.out.println("show1开始执行");show3();}public static void show2() {System.out.println("show2开始执行");show3();}//普通的私有方法,给静态方法服务的private static void show3() {System.out.println("记录程序在运行过程中的各种细节,这里有100行代码。");}
}
六、接口的应用
1.接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了。
2.当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。
七、适配器设计模式
- 设计模式(Design Pattern) 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
适配器可以用来简化代码,避免因为接口中抽象方法过多,而我们只需要使用其中一部分的时候造成的不便。
书写步骤一般为:
1.编写中间类XXXAdapter,实现对应的接口。
2.对接口中的抽象方法进行空实现。
3.让真正的实现类继承中间类,并重写需要用的方法。
4.为了避免其他类去创建适配器类的对象,中间的适配器类用 abstract 修饰。
接口:
package AdapterDesignPattern;public interface Inter {public abstract void method1();public abstract void method2();public abstract void method3();public abstract void method4();public abstract void method5();
}
适配器类:
package AdapterDesignPattern;public abstract class InterAdapter implements Inter {@Overridepublic void method1() {}@Overridepublic void method2() {}@Overridepublic void method3() {}@Overridepublic void method4() {}@Overridepublic void method5() {}
}
实现类:
package AdapterDesignPattern;public class InterImpl extends InterAdapter {//我需要用到哪个方法,就重写哪个方法就可以了@Overridepublic void method5() {System.out.println("只要用第五个方法");}
}相关文章:
【JAVA入门】Day15 - 接口
【JAVA入门】Day15 - 接口 文章目录 【JAVA入门】Day15 - 接口一、接口是对“行为”的抽象二、接口的定义和使用三、接口中成员的特点四、接口和类之间的关系五、接口中新增的方法5.1 JDK8开始接口中新增的方法5.1.1 接口中的默认方法5.1.2 接口中的静态方法 5.2 JDK9 开始接口…...
ES6 之 Set 与 Map 数据结构要点总结(一)
Set 数据结构 Set 对象允许你存储任何类型的唯一值,无论是原始值还是对象引用。 特性: 所有值都是唯一的,没有重复。值的顺序是根据添加的顺序确定的。可以使用迭代器遍历 Set。 常用方法: 1. add(value):添加一个新…...
一文学会用RKE部署高可用Kubernetes集群
k8s架构图 RKE简介 RKE全称Rancher Kubernetes Engine,是一个快速的,多功能的 Kubernetes 安装工具。通过RKE,我们可以快速的安装一个高可用K8S集群。RKE 支持多种操作系统,包括 MacOS、Linux 和 Windows。 K8S原生安装需要的先…...
数据加密的常见方法
数据加密是一门历史悠久的技术,它通过加密算法和加密密钥将明文(原始的或未加密的数据)转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。这一技术的核心是密码学,它利用密码技术对信息进行加密,实现信息隐蔽&#…...
天童美语:推荐给孩子的人文历史纪录片
孩子们都有自己的偏好,有的孩子喜欢打游戏,有的孩子喜欢看剧看电影,有的孩子喜欢看书。针对不同的孩子我们要因材施教,所以,广州天童教育给大家推荐一下适合给孩子看的人文历史类的纪录片,让精美的画面&…...
数字人技术如何推动教育事业可持续创新发展?
数字人技术作为一种新兴的教育手段,无论是幼儿园还是大学课堂,数字人都可以融入于各阶段教育中,结合动作捕捉、AI等技术,提高教育资源的利用。 AI智能交互数字人应用: 数字人结合NLP自然语言处理技术以及AI大模型技术…...
FPGA程序设计
在设计FPGA时,多运用模块化的思想取设计模块,将某一功能设计成module。 设计之前要先画一下模块设计图,列出输入输出接口,再进一步设计内部功能。 状态机要画图,确定每个状态和状态之间怎么切换。状态用localparam定…...
彻底开源,免费商用,上海AI实验室把大模型门槛打下来
终于,业内迎来了首个全链条大模型开源体系。 大模型领域,有人探索前沿技术,有人在加速落地,也有人正在推动整个社区进步。 就在近日,AI 社区迎来首个统一的全链条贯穿的大模型开源体系。 虽然社区有LLaMA等影响力较大…...
MTEB评估基准使用指北
文章目录 介绍评估数据 介绍 文本嵌入通常是在单一任务的少量数据集上进行评估,这些数据集未涵盖其可能应用于其他任务的情况,不清楚在语义文本相似性(semantic textual similarity, STS)等任务上的最先进嵌入是否同样适用于聚类或…...
31. 1049. 最后一块石头的重量 II, 494.目标和,474.一和零
class Solution { public:int lastStoneWeightII(vector<int>& stones) {int sum 0;for(int stone : stones) sum stone;int bagSize sum /2;vector<int> dp(bagSize 1, 0);for(int i 0; i < stones.size(); i){ //遍历物品for(int j bagSize; j >…...
PDF 中图表的解析探究
PDF 中图表的解析探究 0. 引言1. 开源方案探究 0. 引言 一直以来,对文档中的图片和表格处理都非常有挑战性。这篇文章记录一下最近工作上在这块的探究。图表分为图片和表格,这篇文章主要记录了对表格的探究。还有,我个人主要做日本项目&…...
递推(C语言)
文章目录 1.斐波那契数列2.太波那契数列3.二维递推问题4.实战4.1 力扣509 斐波那契数4.2 力扣70 爬楼梯4.3 力扣119 杨辉三角|| 递推最通俗的理解就是数列,递推和数列的关系就好比 算法 和 数据结构 的关系,数列有点 像数据结构中的线性表(可以是顺序表&…...
安卓微信8.0之后如何利用缓存找回的三天之前不可见的朋友圈图片
安卓微信8.0之后如何利用缓存找回的三天之前不可见的朋友圈图片 复习了下安卓程序的知识,我们会了解到,安卓程序清楚数据的时候有两个选项 一个是清除全部数据一个是清除缓存。 清除全部数据表示清除应用数据缓存。 对于安卓微信8.0之后而言࿰…...
ES6 Class(类) 总结(九)
ES6 中的 class 是一种面向对象编程的语法糖,提供了一种简洁的方式来定义对象的结构和行为。 JavaScript 语言中,生成实例对象的传统方法是通过构造函数。下面是一个例子。 function Point(x, y) {this.x x;this.y y; } Point.prototype.toString fu…...
使用 Vue.js 和 Element Plus 实现自动完成搜索功能
使用 Vue.js 和 Element Plus 实现自动完成搜索功能 一、前言1.环境准备2.组件配置3.后端数据请求4.样式5.总结 一、前言 在前端开发中,实现自动完成(autocomplete)功能可以极大地提升用户体验,特别是在需要用户输入和选择内容的…...
SpringBoot自定义starter
SpringBoot自定义starter 1、SpringBoot之starter机制 1.1、什么是自定义starter SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖&#…...
深入探索大语言模型
深入探索大语言模型 引言 大语言模型(LLM)是现代人工智能领域中最为重要的突破之一。这些模型在自然语言处理(NLP)任务中展示了惊人的能力,从文本生成到问答系统,无所不包。本文将从多个角度全面介绍大语…...
querylist多线程采集curlMulti时,报错Curl error(60)
前言 在使用querylist多线程采集的时候,报错: Curl error(60)。测试了下用http时没有问题,https时有问题。其原因在于多线程采集库引用的另一个库有问题。需要手动更改。 解决 找到:vendor/ares333/php-curl/src/Curl.php 文件,…...
Python数据分析~~美食排行榜
目录 1.模块的导入和路径的选择 2.访问前面五行数据 3.按照条件进行筛选 4.获取店铺评分里面的最高分 5.打印对应的店铺的名字 1.模块的导入和路径的选择 # 导入pandas模块,简称为pd import pandas as pd # 使用read_csv()函数 # TODO 读取路径"/Users/fe…...
Linux下解压.tar.gz文件
.tar.gz 是一种常用的压缩包格式,尤其在Unix、Linux以及macOS系统中非常普遍。这个格式结合了两种不同的功能: Tar (.tar): “Tar” 是“Tape Archive”的缩写,最初是为了将数据备份到磁带上而设计的。Tar命令可以将多个文件和目录打包成一个…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.
这个警告表明您在使用Vue的esm-bundler构建版本时,未明确定义编译时特性标志。以下是详细解释和解决方案: 问题原因: 该标志是Vue 3.4引入的编译时特性标志,用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...
Electron简介(附电子书学习资料)
一、什么是Electron? Electron 是一个由 GitHub 开发的 开源框架,允许开发者使用 Web技术(HTML、CSS、JavaScript) 构建跨平台的桌面应用程序(Windows、macOS、Linux)。它将 Chromium浏览器内核 和 Node.j…...
C++课设:实现本地留言板系统(支持留言、搜索、标签、加密等)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、项目功能概览与亮点分析1. 核心功能…...
