Java接口

embedded/2024/10/17 21:17:38/

1 接口的概念

笔记本上的USB口,电源插座等都是接口

接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用

在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型

2 语法规则 

接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口

public interface 接口名称{
// 抽象方法
public abstract void method1(); // public abstract 是固定搭配,可以不写
public void method2();
abstract void method3();
void method4();
// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
}

3 接口使用 

接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。

public class 类名称 implements 接口名称{
// ...
}

注意:子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系

 我们先来定义一个接口:

public interface IUSB {void openDevice();void closeDevice();
}

再来定义第一个Mouse类:

public class Mouse implements IUSB {@Overridepublic void openDevice() {System.out.println("打开鼠标");}@Overridepublic void closeDevice() {System.out.println("关闭鼠标");}public void click(){System.out.println("点击鼠标!");}
}

 第二个KeyBoard类:

public class KeyBoard implements IUSB{@Overridepublic void openDevice() {System.out.println("打开键盘!");}@Overridepublic void closeDevice() {System.out.println("关闭键盘!");}public void input(){System.out.println("键盘输入");}
}

第三个Computer类来实现最后结果:

package demo;public class Computer {public void powerOff() {System.out.println("关闭电脑");}public void powerOn() {System.out.println("打开电脑");}public void useDevice(IUSB usb){usb.openDevice();if(usb instanceof Mouse){Mouse mouse = (Mouse) usb;mouse.click();}if(usb instanceof KeyBoard){KeyBoard keyBoard = (KeyBoard) usb;keyBoard.input();}usb.closeDevice();}public static void main(String[] args) {Computer computer=new Computer();computer.powerOn();computer.useDevice(new KeyBoard());computer.useDevice(new Mouse());computer.powerOff();}}

结果: 

4, 接口特性

1. 接口类型是一种引用类型,但是不能直接new接口的对象

public class TestUSB {
public static void main(String[] args) {
USB usb = new USB();
}
}
// Error:(10, 19)  USB是抽象的; 无法实例化

2. 接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错

public interface USB {
// Error:(4, 18) java: 此处不允许使用修饰符private
private void openDevice();
void closeDevice();
}

3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现

public interface USB {
void openDevice();
// 编译失败:因为接口中的方式默认为抽象方法
// Error:(5, 23)  接口抽象方法不能带有主体
void closeDevice(){
System.out.println("关闭USB设备");
}
}

4. 重写接口中方法时,不能使用默认的访问权限 

public interface USB {
void openDevice(); // 默认是public的
void closeDevice(); // 默认是public的
}
public class Mouse implements USB {
@Override
void openDevice() {
System.out.println("打开鼠标");
}
// ...
}
// 编译报错,重写USB中openDevice方法时,不能使用默认修饰符
// 应该在void前加上public

 5. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量

6. 接口中不能有静态代码块和构造方法

7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class

8. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类

9. jdk8中:接口中还可以包含default方法。

interface A {void test1();static void test2() {System.out.println("static()");   }default void test3() {System.out.println("default()");  }
}
class TestDemo implements A {@Overridepublic void test1() {//必须重写System.out.println("重写方法test1()!");  }@Overridepublic void test3() {//不重写也可以System.out.println("重写test3()"); }
}
public class Test {public static void main(String[] args) {TestDemo testDemo = new TestDemo();testDemo.test1();testDemo.test3();A.test2(); }
}

 5,实现多个接口

在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接 口。

interface IA {void testA();
}
interface IB {void testB();
}
class TestDemo2 implements IA,IB {@Overridepublic void testA() {System.out.println("testA()");}@Overridepublic void testB() {System.out.println("testB()");}
}
public class Test1 extends TestDemo2{public static void main(String[] args) {TestDemo2 testDemo2 = new TestDemo2();testDemo2.testA();testDemo2.testB();}
}

注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。

提示, IDEA 中使用 ctrl + i 快速实现接口

package demomoreiner;public abstract class Animal {protected String name;protected int age;public Animal(String name, int age) {this.name = name;this.age = age;}//继承是对共性的抽取 那么意味着 这里面的成员变量 成员方法 都是共性 共有的public abstract void eat();
}
package demomoreiner;public interface ISwimming {void swim();
}
package demomoreiner;public interface IRunning {void run();
}
package demomoreiner;public interface IFly {void fly();
}
package demomoreiner;public class Fish extends Animal implements ISwimming{public Fish(String name,int age) {super(name,age);}@Overridepublic void swim() {System.out.println(this.name +"游泳!");}@Overridepublic void eat() {System.out.println(this.name + "吃鱼粮!");}
}
package demomoreiner;public class Duck  extends Animal implements ISwimming,IFly,IRunning {public Duck(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(this.name + "吃鸭粮");}@Overridepublic void fly() {System.out.println(this.name + "正在飞....");}@Overridepublic void run() {System.out.println(this.name + "正在跑....");}@Overridepublic void swim() {System.out.println(this.name + "正在游泳....");}
}
package demomoreiner;public class Test {public static void eatFunc(Animal animal) {animal.eat();}public static void walk(IRunning running) {running.run();}public static void main(String[] args) {walk(new Duck("唐老鸭",10));eatFunc(new Duck("唐老鸭",10));}public static void main1(String[] args) {eatFunc(new Duck("唐老鸭",10));eatFunc(new Fish("小鱼儿",3));}
}

 

 上面的代码展示了 Java 面向对象编程中最常见的用法: 一个类继承一个父类, 同时实现多种接口.

 6 接口间的继承

 在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到 多继承的目的。

接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字.

interface IA {void testA();
}
interface IB {void testB();
}
interface IC extends IA,IB{void testC();
}
class TestDemo implements IC {@Overridepublic void testA() {System.out.println("testA()");}@Overridepublic void testB() {System.out.println("testB()");}@Overridepublic void testC() {System.out.println("testC()");}
}public class Test {public static void main(String[] args) {}
}

 

 

 

 

 


http://www.ppmy.cn/embedded/4059.html

相关文章

最小生成树算法的实现c++

最小生成树算法的实现c 题目链接:1584. 连接所有点的最小费用 - 力扣(LeetCode) 主要思路:使用krusal算法,将边的权值进行排序(从小到大排序),每次将权值最小且未加入到连通分量中…

【Python基础】线程

文章目录 [toc]线程与进程的区别与联系同步任务示例 并行任务示例线程调度的“随机性” 线程方法thread_object.start()thread_object.join()thread_object.setDaemon()没有设置守护线程的情况设置守护线程的情况 thread_object.current_thread() 目前爬虫的三种实现单线程爬虫…

如何通过drissionpage以及js逆向过字符/滑块/点选/九宫格验证码文章/视频学习案例

目录 零、各种关于drissionpage文章视频案例解决方案合集一、过字符类验证码反爬实战(自动化和逆向两种解法)二、过滑块类验证码反爬实战(自动化和逆向两种解法)三、过点选类验证码反爬实战(自动化和逆向两种解法)四、过九宫格验证码反爬实战(自动化和逆向两种解法)仅供…

SpringBoot 集成 EasyExcel 3.x 优雅实现 Excel 导入导出

介绍 EasyExcel 是一个基于 Java 的、快速、简洁、解决大文件内存溢出的 Excel 处理工具。它能让你在不用考虑性能、内存的等因素的情况下,快速完成 Excel 的读、写等功能。 EasyExcel文档地址:https://easyexcel.opensource.alibaba.com/ 快速开始 …

PySpark预计算ClickHouse Bitmap实践

1. 背景 ClickHouse全称是Click Stream,Data WareHouse,是一款高性能的OLAP数据库,既使用了ROLAP模型,又拥有着比肩MOLAP的性能。我们可以用ClickHouse用来做分析平台快速出数。其中的bitmap结构方便我们对人群进行交并。Bitmap位…

Stable Diffusion 模型分享:MeinaMix(动漫)meinamix_meinaV11

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 MeinaMix 的目标是:能够在很少的提示下…

vue3使用阿里oss上传资源(上传图片、视频、文件、pdf等等),删除oss资源。获取STS token的接口

vue3使用阿里oss上传资源 全部oss.ts代码如下: import OSS from "ali-oss";// 获取STS token export const getSTSToken async () > {const STS_TOKEN_URL "....."; // 获取STS token的接口,后端提供// fetch方式可按需更换成…

2024 极术通讯-Arm 推出新一代 Ethos-U AI 加速器及全新物联网参考设计平台

导读:极术社区推出极术通讯,引入行业媒体和技术社区、咨询机构优质内容,定期分享产业技术趋势与市场应用热点。 芯方向 Neoverse S3 系统 IP 为打造机密计算和多芯粒基础设施 SoC 夯实根基 Arm Neoverse S3 作为针对基础设施的第三代系统 I…