「MoreThanJava」Day 6:面向对象进阶——多态
- 「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」。
- 当然 不论新老朋友 我相信您都可以 从中获益。如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力!
Part 1. 多态概述
多态,简而言之就是 同一个行为 具有 多个不同表现形式 或形态的能力。在面向对象的程序设计中,多态的能力是通过数据抽象和继承之后得来的。
比如,有一杯水,我不知道它是温的、冰的还是烫的,但是我一摸我就知道了,我摸水杯的这个动作 (方法),对于不同温度的水 (运行时不同的对象类型),就会得到不同的结果,这就是多态。
代码演示:
// 基类定义
public class Water {public void showTem() { }
}
// 冰水
public class IceWater extends Water {@Overridepublic void showTem() { System.out.println("我的温度是: 0度"); }
}
// 温水
public class WarmWater extends Water {@Overridepublic void showTem() { System.out.println("我的温度是: 40度"); }
}
// 开水
public class HotWater extends Water {@Overridepublic void showTem() { System.out.println("我的温度是: 100度"); }
}
// 测试类
public class TestWater {public static void main(String[] args) {Water w = new WarmWater();w.showTem();w = new IceWater();w.showTem();w = new HotWater();w.showTem();}
}
结果输出:
我的温度是: 40度
我的温度是: 0度
我的温度是: 100度
这里的方法 showTem()
就相当于你去摸水杯。我们定义的 Water
类型的引用变量 w
就相当于水杯,你在水杯里放了什么温度的水,那么我摸出来的感觉就是什么。就像代码中的那样,放置不同温度的水,得到的温度也就不同,但水杯是同一个。
里氏替换原则(LSP)
面向对象的设计原则有一条关于多态的原则,它的描述大概是这样子的:子类对象 (object of subtype/derived class) 能够 替换 程序 (program) 中 父类对象 (object of base/parent class) 出现的 任何地方,并且 保证原来程序的逻辑行为 (behavior) 不变及正确性不被破坏。
这么说可能有点抽象,简单说就是 子类和父类的行为应该保持一致。
哪些代码明显违背了 LSP?
实际上,里式替换原则还有另外一个更加能落地、更有指导意义的描述,那就是 “Design By Contract”,中文翻译就是 “按照协议来设计”。定义中父类和子类之间的关系,也可以替换成接口和实现类之间的关系。
为了更好地理解这句话,我举几个违反里式替换原则的例子来解释一下。
1 - 子类违背父类声明要实现的功能
父类中提供的 sortOrdersByAmount()
订单排序函数,是按照金额从小到大来给订单排序的,而子类重写这个 sortOrdersByAmount()
订单排序函数之后,是按照创建日期来给订单排序的。那子类的设计就违背里式替换原则。
2 - 子类违背父类对输入、输出、异常的约定
在父类中,某个函数约定:运行出错的时候返回 null
;获取数据为空的时候返回空集合(empty collection)。而子类重载函数之后,实现变了,运行出错返回异常(exception),获取不到数据返回 null
。那子类的设计就违背里式替换原则。
3 - 子类违背父类注释中所罗列的任何特殊说明
父类中定义的 withdraw()
提现函数的注释是这么写的:“用户的提现金额不得超过账户余额……”,而子类重写 withdraw()
函数之后,针对 VIP 账号实现了透支提现的功能,也就是提现金额可以大于账户余额,那这个子类的设计也是不符合里式替换原则的。
当然,当前的大环境下,注释的可信度还是得斟酌斟酌… (不可尽信…)
Part 2. 向上转型 && 向下转型
再谈向上转型
在 上一篇文章 里面我们已经谈到 —— 对象既可以作为它本身的类型使用,也可以作为它基类的类型使用。而这种把对某个对象的引用视为其基类型的引用的做法被称为 向上转型 (因为在继承树的画法中,基类位于子类上方)。
语句 Water w = new WarmWater();
就是向上转型的典型代码,这会将子类类型 WarmWater
转成父类的 Water
类型。
存在问题
❶ 向上转型时,子类单独定义的方法会丢失。
例如,我们如果在温水中定义一个喝水的方法 drink()
,那么当 w
引用指向 WarmWater
类实例的时候是访问不到 drink()
方法的,w.drink()
会报错。
❷ 子类引用不能指向父类对象。
HotWater hotWater = (HotWater)new Water();
这样是不行的。
向上转型的好处
- 减少重复代码,提高代码可读性;
- 提高系统扩展性;
举个例子,比如我现在有许多不同温度的水,如果不用向上转型,摸水杯这个动作我需要这样写:
// Water 类中方法定义
public void showTem(IceWater water) { water.showTem(); }
public void showTem(WarmWater water) { water.showTem(); }
public void showTem(HotWater water) { water.showTem(); }
// 测试类中调用
water.showTem(new IceWater());
water.showTem(new WarmWater());
water.showTem(new HotWater());
每一种不同温度的水我都需要在 Water
中单独定义一个方法 (因为都是不同的类型),数量一多,就会变得非常冗余和复杂。
但使用向上转型,一切就轻松多了:
// Water 类中方法定义
public void showTem(Water water) { water.showTem(); }
// 测试类中调用
water.showTem(new IceWater());
water.showTem(new WarmWater());
water.showTem(new HotWater());
就算新添加一种温度的水,我也只需要继承 Water
实现 showTem()
方法就行了,原有的代码几乎不需要修改。这也体现了软件设计原则中重要的 开闭原则 —— 对扩展开放,对修改封闭。
向下转型
与向上转型相对应的就是向下转型了 —— 也就是把父类对象转为子类对象。(这有大坑…)
还是用上面的摸水杯的例子来说明,我们先在温水 WarmWater
中加入一个喝水的方法:
public class WarmWater extends Water {@Overridepublic void showTem() { System.out.println("我的温度是: 40度"); }// 新增加的喝水的方法public void drink() { System.out.println("喝水..."); }
}
示例代码:
class Tester {public static void main(String[] args) {Water water = new WarmWater();// 子类实例赋给父类引用 - 向上转型WarmWater warmWater = (WarmWater) water;// Water向下转型为WarmWaterwarmWater.drink();IceWater iceWater = (IceWater) water;// Water向下转型为IceWatericeWater.drink();// IDE 提示无法找到 drink() 方法}
}
为什么第一段代码不报错呢?因为 water
本身就是 WarmWater
类型的对象,所以它理所当然的可以向下转型为 WarmWater
类型了,也理所当然的不能转型为 IceWater
,这就好像你见过 一条狗突然变成一只猫 的情况吗?
再来看下列代码:
class Tester {public static void main(String[] args) {Water water = new Water();WarmWater warmWater = (WarmWater) water;// 下列代码报错:java.lang.ClassCastException: class Water cannot be cast to class WarmWaterwarmWater.drink();}
}
上面例子想要说明的是,Water
类型的对象 (父类型) 不能向下转型为任何类型的对象。这就好像你去考古,你发现了一个新生物,你知道它是一种动物,但你不能直接说它是猫或者狗…
向下转型注意事项
- 向下转型的前提是父类对象指向的是子类对象;(也就是对应上面实例代码中向下转型
WarmWater
的情况…new WarmWater()
首先得完成向上的转型…) - 向下转型只能转型为本类对象;(猫是不能变成狗的… 对应上方
WamWater
类型就不能转成IceWarm
类型的情况)
向下转型的意义
有的小伙伴可能看到这里有点懵了… 向下转型需要先向上转型,这转来转去好玩儿是吗?
向上转型让我们有了统一处理一类抽象事物的能力,这大大减少了我们的重复代码,并增加了我们代码的可扩展性。可事实上是,尽管我们尽力抽象一类事物,让他们尽可能地保证行为的统一,但总有例外!(就像 上一次 我们讨论继承时提到的鸟类的例子,并不是所有鸟都能飞或者叫!)
所以当例外来临时,我们就可以及时判断并做对应的处理。(这也比较符合现实的情况)
最典型的例子就是 JDK 中的某一些集合类,对于集合类来说,并不需要记住存储所有存储对象的类型,而是统一抽象成了 Node
类型,就拿 HashMap
来说吧,存储一个元素 (putVal()
方法) 时就要判定当前节点时属于链表还是红黑树的部分:
Part 3. 多态经典案例分析
我们来看一个经典的例子:
// A 类
public class A {public String show(D object) { return "A and D"; }public String show(A object) { return "A and A"; }
}
// B 类
public class B extends A {public String show(B object) { return "B and B"; }@Overridepublic String show(A object) { return "B and A"; }
}
// C 类
public class C extends B{ }
// D 类
public class D extends B{ }
测试类:
public class Tester {public static void main(String[] args) {A a = new A();A aRefB = new B();B b = new B();C c = new C();D d = new D();System.out.println("1-" + a.show(b));System.out.println("2-" + a.show(c));System.out.println("3-" + a.show(d));System.out.println("4-" + aRefB.show(b));System.out.println("5-" + aRefB.show(c));System.out.println("6-" + aRefB.show(d));System.out.println("7-" + b.show(b));System.out.println("8-" + b.show(c));System.out.println("9-" + b.show(d));}
}
输出结果:
1-A and A
2-A and A
3-A and D
4-B and A
5-B and A
6-A and D
7-B and B
8-B and B
9-A and D
前三个比较容易,因为 B、C 都本质上是 A 类,所以 1
和 2
都进入了 A 类中签名为 show(A)
的方法。
但是第四个非常奇怪,A 对象类型引用了一个 B 类型的实例,输出是 B and A
,而不是想象中的 B and B
,为什么呢?
这里有一个新知识点:决定调用哪个方法的是引用变量类型。
拿这里的 aRefB.show(b)
来说好了,aRefB
虽然是 A 类型的引用,但首先会查找 B 对象中的方法 (因为它实际的指向是 B),而引用 b
正好是一个 B 类型 (实质上是 is-a A 类型),所以符合 B 对象中签名为 show(A)
的方法,就输出了 B and A
。如果 B 类型中没有符合签名的方法,那么会从父类中查找,继续这个过程直到找到或者报错。
如果你能理解这个过程,并分析其他的情况,那么说明你真的掌握了。
再来分析 b.show(d)
输出 A and D
的情况,就简单很多了:B 对象中不存在 show(D)
这样的签名,所以从父类 A 中查找,故输出了 A and D
。
要点回顾
- 多态概述 / 里氏替换原则 / 向上向下转型;
- 典型多态案例分析 / 练习;
练习
练习 1:工资结算系统
某公司有三种类型的员工,分别是部门经理、程序员和销售员。需要设计一个工资结算系统,根据提供的员工信息来计算月薪。
部门经理的月薪是每月固定
15000
元;
程序员的月薪按每月工作时间计算,每小时150
元;
销售员的月薪是1200
底薪加上销售额5%
的提成;
抽象员工类:
public abstract class AbstractEmployee {private String name;public AbstractEmployee(String name) {this.name = name;}// 获取工资public abstract double getSalary();public String getName() { return name; }public void setName(String name) { this.name = name; }
}
项目经理类:
public class Manager extends AbstractEmployee {public Manager(String name) {super(name);}@Overridepublic double getSalary() { return 15000; }
}
程序员类:
public class Programer extends AbstractEmployee {private Integer workHours;public Programer(String name, Integer workHours) {super(name);this.workHours = workHours;}// 仅提供单独的 set 方法,工作时间理论上来说是一个私人的消息..public void setWorkHours(Integer workHours) {this.workHours = workHours;}@Overridepublic double getSalary() { return 150 * workHours; }
}
销售员类:
public class Salesman extends AbstractEmployee {private Integer salesAmount;public Salesman(String name, Integer salesAmount) {super(name);this.salesAmount = salesAmount;}// 也仅提供 set 方法,并不是所有人都能访问销售人员的销售金额public void setSalesAmount(Integer salesAmount) {this.salesAmount = salesAmount;}@Overridepublic double getSalary() { return 1200 + 0.05 * salesAmount; }
}
测试类:
import java.util.List;public class Tester {public static void main(String[] args) {// 项目经理张三、996程序员李四、月销售过万的明星销售员王五List<AbstractEmployee> employees = List.of(new Manager("张三"), new Programer("李四", (21 - 9) * 6), new Salesman("王五", 10000));// 发工资..for (AbstractEmployee employee : employees) {System.out.println(employee.getName() + "工资为:" + employee.getSalary());}}
}
程序输出:
张三工资为:15000.0
李四工资为:10800.0
王五工资为:1700.0
(ps:有感受到来自于现实主义的正义光辉洒在你的身上吗?)
参考资料
- 《Java 核心技术 卷 I》
- 《Java 编程思想》
- Introduction to Computer Science using Java - http://programmedlessons.org/Java9/index.html
- 重新认识java(五) ---- 面向对象之多态(向上转型与向下转型) - https://blog.csdn.net/qq_31655965/article/details/54746235
- 极客时间 | 设计模式之美 - https://time.geekbang.org/column/article/177110
- Python 100 天从新手到大师 - https://github.com/jackfrued/Python-100-Days
- 本文已收录至我的 Github 程序员成长系列 【More Than Java】,学习,不止 Code,欢迎 star:https://github.com/wmyskxz/MoreThanJava
- 个人公众号 :wmyskxz,个人独立域名博客:wmyskxz.com,坚持原创输出,下方扫码关注,2020,与您共同成长!
非常感谢各位人才能 看到这里,如果觉得本篇文章写得不错,觉得 「我没有三颗心脏」有点东西 的话,求点赞,求关注,求分享,求留言!
创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- XP Professional开机就要激活,否则无法登录桌面(转载)
上个月有门课程实验需要XP系统,所有参考这篇博客:VMware Workstation:安装windows xp系统在虚拟机中装了xp专业版,当时成功安装并激活了,但是一个月后出现了这样的问题:(这里截取了该文章下的一条评论,该读者与我出现的问题一样)网上有很多方法,本文参考这篇文章XP P…...
2024/3/29 4:11:45 - SQL Server小数取整
四舍五入 ROUND(要舍入的字段,规定要返回的小数位数可以为0)向上取整: FLOOR(字段)向下取整: CEILING(字段)...
2024/4/8 4:03:55 - Qt音视频开发9-ffmpeg录像存储
一、前言 上一篇文章写道直接将视频流保存裸流到文件,尽管裸流文件有一定的好处,但是 毕竟大部分用户需要的不是裸流而是MP4视频文件,所以需要将视频流保存成MP4文件,毕竟电脑上的播放器包括默认的播放器,可以直接播放MP4文件,而未必能播放裸流文件,裸流文件需要安装K-L…...
2024/4/18 11:17:12 - 制作智能车
制作一辆智能车 这里写目录标题制作一辆智能车简介:硬件:STM32F103ZET6开发板L298N电机驱动模块电源模块TT直流减速电机一个四路红外循迹模块超声波支架和HC-SR04超声波模块红外接收头和红外遥控器软件采用PWM控制电机输入捕获解码红外信号 简介: 大学第一学期就希望自己能够…...
2024/3/31 0:18:16 - 红外通信红外编码—NEC协议
红外通信主要了解三部分内容,一是了解红外遥控电路的组成;二是了解信号调制和解调;三是了解红外编码协议及解码,其中最常用的就是NEC协议。 一. 红外遥控电路的组成 通常,红外遥控系统由发射装置和接收装置两部分组成。最常见的发射装置是遥控器,其组成为按键部分,电源部…...
2024/4/24 7:28:08 - 什么是SaaS模式 - SaaS模式的视频会议系统
随着互联网技术的飞速发展,传统软件模式在互联网技术的融合下成就了互联网在线软件服务模式的形成。使得互联网在线软件服务商提出了软件即服务的概念,从而诞生了SaaS软件服务模式。SaaS是Software-as-a-service(软件即服务)。它与“on-demand software”(按需软件),the ap…...
2024/4/23 21:55:10 - 机器学习8-贝叶斯分类器
师兄博客原文地址 https://blog.csdn.net/LogHouse/article/details/97376419 从零开始的机器学习8-贝叶斯分类器一些问题编程实现朴素贝叶斯载入西瓜数据集贝叶斯分类统计不同类的先验概率统计每个特征的条件概率计算后验概率计算测试样本(结果)最可能的类别(原因)主函数 智能…...
2024/3/31 1:04:15 - Spring aop学习笔记
AOP面向切面编程,通过动态代理实现 一个类加载器可以加载多个类 如何获得代理对象? 所有动态代理类全都继承Proxy类 JDK中提供了Proxy类 有newProxyInstance方法创建代理实例,有三个参数类加载器 实现要代理类的接口 如何实现代理类接口的方法, 用InvocationHandler实现,i…...
2024/3/31 1:25:58 - 机器学习9-集成学习
师兄博客原文地址 https://blog.csdn.net/LogHouse/article/details/97523458 从零开始的机器学习9-集成学习一些问题1.谈谈集成学习的概念和思想。2.集成学习方法可以分为哪几类,并且分别阐述它们的特点。3.在集成学习中,阐述针对二分类问题的AdaBoost算法实现过程。思考…...
2024/3/30 23:15:38 - VirtualBox安装CentOS虚拟机实验
实验目的:本来一直想使用云主机做实验的,没打算在本地安装虚拟机的,但因为后续准备安装kubernetes,今天在官网上大概看了下安装指导,有介绍minikube安装的,是入门学习使用的,可以安装在自己笔记本电脑或者台式机上,需要借助VirtualBox、VMware Workstation、KVM等虚拟化…...
2024/3/30 22:50:57 - 免费的java代码混淆,程序加密推荐
java代码可以反编译,特别是放在客户端的程序很用被剽窃,盗用.保护程序一般都有以下几个方法:1、将class文件加密,这个是最安全的,但也费事儿,因为要重写classloader来解密class文件;2、使用花指令,使得class文件不能反编译(利用反编译工具漏洞);安全性一般,还是有花指…...
2024/3/30 23:33:56 - Python深度学习之理解循环神经网络
Deep Learning with Python 这篇文章是我学习《Deep Learning with Python》(第二版,Franois Chollet 著) 时写的系列笔记之一。文章的内容是从 Jupyter notebooks 转成 Markdown 的,你可以去 GitHub 或 Gitee 找到原始的 .ipynb 笔记本。 你可以去这个网站在线阅读这本书的…...
2024/3/30 23:52:11 - CentOS1611最小化安装部署
本文包含CAS虚拟化环境、VMWare ESXI环境、物理机环境的操作系统安装过程操作指导。2.1 CAS虚拟化环境创建虚拟机输入虚拟机名称并选择操作系统为Linux以及对应版本为CentOS 6/7(64位):硬件配置选择:CPU 2核心,内存 8GB,网络需要自行确认,磁盘200GB,光驱镜像选择1611版…...
2024/3/31 1:07:38 - Leetcode_Python 396 旋转函数
解题思路当本题的len(A)<=1时候,结果一定为零。 当len(A)>1时,我们可以得到递推公式即F(k)=F(k-1)+len(A)*A[len(A)-k]+sum(A)。 其中最大的值,即为所求。代码 class Solution(object):def maxRotateFunction(self, A):""":type A: List[int]:rtype: i…...
2024/3/31 3:46:28 - [C#笔记] byte转bitmap
在网上找的,调试成功后记录一下。 public Bitmap Byte2Bitmap(byte[] rawValues, int width, int height){// 申请目标位图的变量,并将其内存区域锁定Bitmap bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed);BitmapData bmpData = bmp.LockBits(new Rectang…...
2024/4/10 18:13:54 - 二维数组实现java电话本
package day5;import java.util.Arrays; import java.util.Scanner;public class phoneNote {//菜单public static void menu(){System.out.println("========================================================================");System.out.println("1、添加…...
2024/4/22 8:58:49 - 刷脸支付广泛应用于无人领域
现在很多人出门就带一部手机,但是手机也会没电、没信号,并且还要手拿着才能完成支付。但是刷脸支付就方便很多,比如在超市买单的时候双手是不方便的,而刷脸支付就可以完美避开这些问题。并且通过最新的3D面部辨认,再结合硬件和软件的双层优势,人脸识别的准确率高达。 对于…...
2024/3/31 1:12:06 - 使用windeployqt打包qt时遇到的问题
使用windeployqt打包qt时遇到的问题打包教程参考问题1 配置环境变量2 和anaconda或者其他带mingw的冲突3 第三方库需要手动复制到目录下未解决的 打包教程参考 链接: www.jianshu.com/p/c0323b4efc77. 问题 打包时遇到各种dll文件缺失,问题多半出现在环境变量上,没使用正确的…...
2024/4/1 23:40:28 - 学习FreeRTOS之路(一):RTOS基础介绍,与FreeRTOS的变量类型、命名规范
前言: 依照惯例,还是自我发挥几句,ESP32的学习大致告一段落,正如我的博客更新状态,目前正在ESP32项目实践。在裸机系统里,所有的操作都是在一个无限的大循环中实现的。编写代码的过程中,确实觉得功能和功能之间的架构,关系,时序等,单纯的用裸机系统来运行太过麻烦,代…...
2024/3/30 22:53:08 - vue如何拖拽element-ui的table
最近遇到一个需求,组长想给table添加一个拖拽功能,可以让操作者快速的排序而不是一条数据一条数据的修改,由于element ui官方并没有提供table的 拖拽功能,为了响应号召,不重复造轮子,这里我们使用SortableJS。首先,我们需要安装这一工具 在终端输入命令 npm install sor…...
2024/3/31 0:09:02
最新文章
- HYBBS表白墙爆款源码!轻松搭建表白墙网站,更可一键封装成APP,让爱传递无界限
PHP表白墙网站源码,适用于校园内或校区间使用,同时支持封装成APP。告别使用QQ空间的表白墙。 简单安装,只需PHP版本5.6以上即可。 通过上传程序进行安装,并设置账号密码,登录后台后切换模板,适配手机和PC…...
2024/4/24 12:02:52 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 【Godot4自学手册】第三十五节摇杆控制开门
本节主要实现,在地宫墙壁上安装一扇门,在核实安装一个开门的摇杆,攻击摇杆,打开这扇门,但是只能攻击一次,效果如下: 一、添加完善节点 切换到underground场景,先将TileMap修改一下…...
2024/4/23 5:54:10 - 2024 年高效开发的 React 生态系统
要使用 React 制作应用程序,需要熟悉正确的库来添加您需要的功能。例如,要添加某个功能(例如身份验证或样式),您需要找到一个好的第三方库来处理它。 在这份综合指南中,我将向您展示我建议您在 2024 年使用…...
2024/4/23 21:33:02 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/4/24 0:58:35 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/4/24 1:17:44 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/4/24 11:04:21 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/4/24 9:59:40 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/4/24 11:04:20 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/4/24 11:04:20 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/4/24 9:58:43 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/4/24 11:04:19 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/4/24 11:04:19 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/4/24 11:04:18 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/4/24 11:04:18 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/4/24 11:04:17 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/4/24 1:18:42 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/4/24 1:18:59 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/4/24 11:04:13 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/4/24 11:04:13 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/4/24 11:04:13 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/4/24 9:54:49 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/4/24 10:43:15 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/4/24 1:02:34 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57