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

【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. 引言 一直以来&#xff0c;对文档中的图片和表格处理都非常有挑战性。这篇文章记录一下最近工作上在这块的探究。图表分为图片和表格&#xff0c;这篇文章主要记录了对表格的探究。还有&#xff0c;我个人主要做日本项目&…...

递推(C语言)

文章目录 1.斐波那契数列2.太波那契数列3.二维递推问题4.实战4.1 力扣509 斐波那契数4.2 力扣70 爬楼梯4.3 力扣119 杨辉三角|| 递推最通俗的理解就是数列&#xff0c;递推和数列的关系就好比 算法 和 数据结构 的关系&#xff0c;数列有点 像数据结构中的线性表(可以是顺序表&…...

安卓微信8.0之后如何利用缓存找回的三天之前不可见的朋友圈图片

安卓微信8.0之后如何利用缓存找回的三天之前不可见的朋友圈图片 复习了下安卓程序的知识&#xff0c;我们会了解到&#xff0c;安卓程序清楚数据的时候有两个选项 一个是清除全部数据一个是清除缓存。 清除全部数据表示清除应用数据缓存。 对于安卓微信8.0之后而言&#xff0…...

ES6 Class(类) 总结(九)

ES6 中的 class 是一种面向对象编程的语法糖&#xff0c;提供了一种简洁的方式来定义对象的结构和行为。 JavaScript 语言中&#xff0c;生成实例对象的传统方法是通过构造函数。下面是一个例子。 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.总结 一、前言 在前端开发中&#xff0c;实现自动完成&#xff08;autocomplete&#xff09;功能可以极大地提升用户体验&#xff0c;特别是在需要用户输入和选择内容的…...

SpringBoot自定义starter

SpringBoot自定义starter 1、SpringBoot之starter机制 1.1、什么是自定义starter ​ SpringBoot中的starter是一种非常重要的机制(自动化配置)&#xff0c;能够抛弃以前繁杂的配置&#xff0c;将其统一集成进starter&#xff0c;应用者只需要在maven中引入starter依赖&#…...

深入探索大语言模型

深入探索大语言模型 引言 大语言模型&#xff08;LLM&#xff09;是现代人工智能领域中最为重要的突破之一。这些模型在自然语言处理&#xff08;NLP&#xff09;任务中展示了惊人的能力&#xff0c;从文本生成到问答系统&#xff0c;无所不包。本文将从多个角度全面介绍大语…...

querylist多线程采集curlMulti时,报错Curl error(60)

前言 在使用querylist多线程采集的时候&#xff0c;报错: Curl error(60)。测试了下用http时没有问题&#xff0c;https时有问题。其原因在于多线程采集库引用的另一个库有问题。需要手动更改。 解决 找到&#xff1a;vendor/ares333/php-curl/src/Curl.php 文件&#xff0c…...

Python数据分析~~美食排行榜

目录 1.模块的导入和路径的选择 2.访问前面五行数据 3.按照条件进行筛选 4.获取店铺评分里面的最高分 5.打印对应的店铺的名字 1.模块的导入和路径的选择 # 导入pandas模块&#xff0c;简称为pd import pandas as pd # 使用read_csv()函数 # TODO 读取路径"/Users/fe…...

Linux下解压.tar.gz文件

.tar.gz 是一种常用的压缩包格式&#xff0c;尤其在Unix、Linux以及macOS系统中非常普遍。这个格式结合了两种不同的功能&#xff1a; Tar (.tar): “Tar” 是“Tape Archive”的缩写&#xff0c;最初是为了将数据备份到磁带上而设计的。Tar命令可以将多个文件和目录打包成一个…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...

Linux-进程间的通信

1、IPC&#xff1a; Inter Process Communication&#xff08;进程间通信&#xff09;&#xff1a; 由于每个进程在操作系统中有独立的地址空间&#xff0c;它们不能像线程那样直接访问彼此的内存&#xff0c;所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上&#xff0c;比如&#xff1a;PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发&#xff0c;当设备上用的是modbus从站时&#xff0c;采集设备数据需要开发modbus主站&#xff1b;当设备上用的是西门子PN协议时&#xf…...