面向对象编程第三式: 多态 (Java篇)
本篇会加入个人的所谓‘鱼式疯言’
❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!
前言
在前面两篇文章中,小编带着友友们详细的熟悉了我们面向对象的前两式-------- 封装, 继承
而在本篇文章中小编讲带着小伙伴具体走进咱们第三式: 多态
竟然都进入第三式了, 我们的难度也会加大哦,小伙伴们一定要认真的阅读小编的讲解哦 💖 💖 💖
还是老规矩,小伙伴们从目录开始吧 💖 💖 💖
目录
- 重写
- 向上转型与向下转型
- 多态的实现
- 多态的优缺点
当小编写出第一个小标题的时候,小爱同学就问了,
我们不是讲多态吗? 怎么变成重写了,那重写是什么? 向下转型和向上转型又什么呢?
浅浅和小伙伴先透露一下哦,我们要实现多态就需要两个原理:
一个是 重写
另外一个就是我们的 向上转型 。
所以让小编带着带着循序渐进,脚踏实地的走入多态的海洋哦。 💖 💖 💖
一. 重写
1. 重写的初识
重写(override):也称为覆盖。
重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写, 返回值和形参都不能改变。
重写的好处在于 子类可以根据需要,定义特定于自己的行为。
也就是说子类能够根据需要实现父类的方法。
鱼式疯言
如果非要小编用9个字来概括的话,非他们莫属了 😁 😁 😁
即外壳不变,核心重写!
2. 举个栗子
class Dog {public void bark() {System.out.println("woof");}
}class Hound extends Dog {public void sniff() {System.out.println("sniff");}@Overridepublic void bark() {System.out.println("bowl");}
}class Test {public static void main(String[] args) {Hound hound=new Hound();hound.bark();}
}
通过上面的栗子证明了我们方法重写的哪些规则呢
方法重写规则
-
子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致
被重写的方法返回值类型可以不同,但是必须是具有父子关系的 -
访问权限不能比父类中被重写的方法的 访问权限更低 。
-
例如:如果父类方法被 public修饰 ,则子类中重写该方法就不能声明为 protected
-
父类被static、private修饰的方法、构造方法都不能被重写。
-
重写的方法, 可以使用 @Override 注解来显式指定.
-
有了这个注解能帮我们进行一些 合法性校验. 例如不小心将方法名字拼写错了 (比如写成 aet),
-
那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写.
鱼式疯言
给大家举个生活中的栗子就明白我们 重写的重要性 了
对于已经投入使用的类,尽量不要进行修改。
最好的方式是:重新定义一个新的类,来重复利用其中共性的内容,并且添加或者改动新的内容。
例如:若干年前的手机,只能打电话,发短信,来电显示只能显示号码,而今天的手机在来电显示的时候,不仅仅可以显示号码,还可以显示头像,地区等。
在这个过程当中,我们不应该在原来老的类上进行修改,因为原来的类,可能还在有用户使用,正确做法是:新建一个新手机的类,对来电显示这个方法重写就好了,这样就达到了我们当今的需求了。
当我们熟悉了重写之后,和我们之前学过的重载又有什么异同之处呢 💕 💕 💕
3. 重写与重载的区别
class Dog {public void bark() {System.out.println("woof");}public void bark(int num) {for (int i = 0; i < num; i++) {System.out.print("woof ");}}
}class Hound extends Dog {public void sniff() {System.out.println("sniff");}@Overridepublic void bark() {System.out.println("bowl");}
}class Test {public static void main(String[] args) {Hound hound=new Hound();hound.bark();Dog dog=new Dog();dog.bark(5);}
}
从中我们把他们分解着来看
从什么的图解中我们就明白了,重写和重载的最本质的区别
即: 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
鱼式疯言
有图有真相
、
二. 向上转型和向下转型
1. 向上转型
<1>. 向上转型简介
向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。
语法格式::父类类型 对象名 = new 子类类型()
et:Animal animal = new Cat(“元宝”,2);
animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换。
<2>. 举个栗子
class Animal {String name;int age;public Animal (String name,int age) {this.name=name;this.age=age;}public void eat() {System.out.println(name+"吃饭");}}class Cat extends Animal {public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(super.name+"吃鱼~~~~~");}
}class Dog extends Animal {public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(super.name+"吃骨头~~~~");}
}class Test {public static void main(String[] args) {Animal animal1=new Cat("小喵",14);animal1.eat();Animal animal2=new Dog("小汪",18);animal2.eat();}
}
鱼式疯言:
画个小图说明下:
<3>. 向上转型的实际运用
小编总结向上转型的三个使用场景
- 直接赋值
- 方法传参
- 方法返回
下面让小伙们一起来证明下这三个使用场景吧
class Animal {String name;int age;public Animal (String name,int age) {this.name=name;this.age=age;}public void eat() {System.out.println(name+"吃饭");}}class Cat extends Animal {public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(super.name+"吃鱼~~~~~");}
}class Dog extends Animal {public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(super.name+"吃骨头~~~~");}
}class TestAnimal {// 2. 方法传参:形参为父类型引用,可以接收任意子类的对象public static void eatFood(Animal a){a.eat();}// 3. 作返回值:返回任意子类对象public static Animal buyAnimal(String var){if("狗".equals(var) ){return new Dog("狗狗",1);}else if("猫" .equals(var)){return new Cat("猫猫", 1);}else{return null;}}public static void main(String[] args) {// 1. 直接赋值:子类对象赋值给父类对象Animal cat = new Cat("元宝",2);Dog dog = new Dog("小七", 1);eatFood(cat);eatFood(dog);Animal animal = buyAnimal("狗");animal.eat();animal = buyAnimal("猫");animal.eat();}
}
鱼式疯言
最后小编补充个点哦
向上转型的 优点 :让代码实现更简单灵活。
向上转型的 缺陷 :不能调用到子类特有的方法。
2. 向下转型
有 向上转型 就必然有 向下转型
<1>. 向下转型的简介
将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法。
但有时候可能需要调用 子类特有的方法 。
此时:将父类引用再还原为子类对象即可,即向下转换。
这是下面这张图啦 😁 😁 😁
<2>. 举个栗子
class Animal {String name;int age;public Animal (String name,int age) {this.name=name;this.age=age;}public void eat() {System.out.println(name+"吃饭");}}class Cat extends Animal {public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(super.name+"吃鱼~~~~~");}
}class Dog extends Animal {public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(super.name+"吃骨头~~~~");}
}class TestAnimal {public static void main(String[] args) {Cat cat = new Cat("元宝",2);Dog dog = new Dog("小七", 1);
// 向上转型Animal animal = cat;animal.eat();animal = dog;animal.eat();// 编译失败,编译时编译器将animal当成Animal对象处理// 而Animal类中没有bark方法,因此编译失败// animal.bark();// 向上转型// 程序可以通过编程,但运行时抛出异常---因为:animal实际指向的是狗// 现在要强制还原为猫,无法正常还原,运行时抛出:ClassCastExceptioncat = (Cat)animal;cat.eat();// animal本来指向的就是狗,因此将animal还原为狗也是安全的dog = (Dog)animal;dog.eat();}
}
上面的结果怎么会出现这样子呢,原来啊
所以 向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。
Java中为了提高向下转型的安全性
引入了instanceof ,如果该表达式为true,则可以安全转换。
class Animal {String name;int age;public Animal (String name,int age) {this.name=name;this.age=age;}public void eat() {System.out.println(name+"吃饭");}}class Cat extends Animal {public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(super.name+"吃鱼~~~~~");}public void mew() {System.out.println(super.name+"正在mew~~~~");}
}class Dog extends Animal {public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(super.name+"吃骨头~~~~");}public void bark() {System.out.println(super.name+"正在bark~~~~");}
}class TestAnimal {public static void main(String[] args) {Cat cat = new Cat("元宝",2);Dog dog = new Dog("小七", 1);
// 向上转型Animal animal = cat;animal.eat();animal = dog;animal.eat();if(animal instanceof Cat){cat = (Cat)animal;cat.mew();}if(animal instanceof Dog){dog = (Dog)animal;dog.bark();}}}
很明显我们看到当我们用 instanceof 关键字时,代码的安全性就提高了很多
三. 多态的实现
1.多态的简介
多态的概念:通俗来说,就是多种形态
具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状态。
好比下面这些小图 😎 😎 😎
鱼式疯言
总的来说:同一件事情,发生在 不同对象身上,就会产生不同的结果。
2. 多态实现的条件
在java中要实现多态,必须要满足如下几个条件,缺一不可:
- 必须在 继承体系 下
- 子类必须要对父类中方法进行重写
- 通过父类的引用 调用重写的方法
<1>. 举个栗子
class Animal {String name;int age;public Animal (String name,int age) {this.name=name;this.age=age;}public void eat() {System.out.println(name+"吃饭");}}class Cat extends Animal {public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(super.name+"吃鱼~~~~~");}public void mew() {System.out.println(super.name+"正在mew~~~~");}
}class Dog extends Animal {public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(super.name+"吃骨头~~~~");}public void bark() {System.out.println(super.name+"正在bark~~~~");}
}///分割线//class TestAnimal {// 编译器在编译代码时,并不知道要调用Dog 还是 Cat 中eat的方法// 等程序运行起来后,形参a引用的具体对象确定后,才知道调用那个方法// 注意:此处的形参类型必须时父类类型才可以
public static void eat(Animal a){a.eat();}
public static void main(String[] args) {Cat cat = new Cat("元宝", 2);Dog dog = new Dog("小七", 1);eat(cat);eat(dog);
}}
在上述代码中, 分割线上方的代码是 类的实现者 编写的, 分割线下方的代码是 类的调用者 编写的.
当类的调用者在编写 eat 这个方法的时候, 参数类型为 Animal (父类)
此时在该方法内部并不知道, 也不关注当前的a 引用指向的是哪个类型 (哪个子类)的实例.
此时 a这个引用调用 eat方法可能会有多种不同的表现(和 a 引用的实例相关), 这种行为就称为 多态.
我们面向对象编程的多态只是一种 编程思维
而真正操作是我们称为: 动态绑定
2. 静态绑定与动态绑定
<1>. 静态绑定
静态绑定:也称为 前期绑定(早绑定)
class Test9 {public static int sum(int x,int y) {return x+y;}public static double sum (double x,double y,double z) {return x+y+z;}public static void main(String[] args) {System.out.println(sum(2, 6));System.out.println(sum(1.2, 3.5, 9.3));}
}
即在编译时,根据用户所传递实参类型就确定了具体 调用 那个方法。
典型代表函数重载。
<2>. 动态绑定
动态绑定:也称为 后期绑定(晚绑定)
具体的栗子我们在多态中已经充分的体现了,下编在这里就不赘述了 😊 😊 😊
即在编译时,不能确定 方法的行为 ,需要等到 程序运行 时,才能够确定具体调用那个 类的方法 。
鱼式疯言
用大白话说就是
动态绑定: 编译时确定,运行时改变
静态绑定: 编译时确定,运行时也确定
四. 多态的优缺点
class Shape {//属性....public void draw() {System.out.println("画图形!");}
}
class Rect extends Shape{@Overridepublic void draw() {System.out.println("♦");}
}
class Cycle extends Shape{@Overridepublic void draw() {System.out.println("●");}
}
【使用多态的好处】
什么叫 “圈复杂度” ?
圈复杂度是一种描述一段代码复杂程度的方式. 一段代码如果平铺直叙, 那么就比较简单容易理解.
而如果有很多的条件分支或者循环语句, 就认为理解起来更复杂.
因此小伙伴们可以简单粗暴的计算一段代码中条件语句和循环语句出现的个数, 这个个数就称为 “圈复杂度”.
如果一个方法的圈复杂度太高, 就需要考虑重构.
不同公司对于代码的圈复杂度的规范不一样. 一般不会超过 10 .
1. 圈复杂度低
<1>.普通栗子one
class Shape {//属性....public void draw() {System.out.println("画图形!");}
}
class Rect extends Shape{@Overridepublic void draw() {System.out.println("♦");}
}
class Cycle extends Shape{@Overridepublic void draw() {System.out.println("●");}
}class Flower extends Shape{@Overridepublic void draw() {System.out.println("❀");}
}class Test {public static void drawShapes() {Rect rect = new Rect();Cycle cycle = new Cycle();Flower flower = new Flower();String[] shapes = {"cycle", "rect", "cycle", "rect", "flower"};for (String shape : shapes) {if (shape.equals("cycle")) {cycle.draw();} else if (shape.equals("rect")) {rect.draw();} else if (shape.equals("flower")) {flower.draw();}}}public static void main(String[] args) {drawShapes();}
}
从这个普通栗子中是不是就能看出我们的 圈复杂度 是不是 很高
那如果是使用多态的思想来解决问题呢 🤔 🤔 🤔
<2>.多态栗子two
class Shape {//属性....public void draw() {System.out.println("画图形!");}
}
class Rect extends Shape{@Overridepublic void draw() {System.out.println("♦");}
}
class Cycle extends Shape{@Overridepublic void draw() {System.out.println("●");}
}class Flower extends Shape{@Overridepublic void draw() {System.out.println("❀");}
}class Test {public static void drawShapes() {
// 我们创建了一个 Shape 对象的数组.Shape[] shapes = {new Cycle(), new Rect(), new Cycle(),new Rect(), new Flower()};for (Shape shape : shapes) {shape.draw();}}public static void main(String[] args) {drawShapes();}
}
2. 可扩展能力强
如果要新增一种新的形状, 使用多态的方式代码改动成本也比较低.
class Triangle extends Shape {
@Override
public void draw() {
System.out.println("△");
}
}
对于类的调用者来说**(drawShapes方法),** 只要创建一个新类的实例就可以了, 改动成本很低.
而对于不用多态的情况, 就要把 drawShapes 中的 if - else 进行一定的修改, 改动成本更高.
有优点就会有缺点
3. 多态的缺陷
- 属性没有多态性
当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性
- 构造方法没有多态性
见如下代码
4. 避免在构造方法中调用重写方法
class B {public B() {
// do nothingfunc();}public void func() {System.out.println("B.func()");}
}
class D extends B {private int num = 1;@Overridepublic void func() {System.out.println("D.func() " + num);}
}class Test {public static void main(String[] args) {D d = new D();}
}
- 构造 D 对象的同时, 会调用 B 的构造方法.
- B 的构造方法中调用了 func 方法, 此时会触发动态绑定, 会调用到 D 中的 func
- 此时 D 对象自身还没有构造, 此时 num 处在未初始化的状态, 值为 0. 如果具备多态性,num的值应该是1.
- 所以在构造函数内,尽量避免使用实例方法,除了final和private方法。
鱼式疯言
结论:
“用尽量简单的方式使对象进入可工作状态”, 尽量不要在
构造器中调用方法
(如果这个方法被子类重写, 就会触发动态绑定, 但是此时子类对象还没构造完成)
可能会出现一些隐藏的但是又极难发现的问题.
总结
- 重写: 理解了重写是在什么前提下进行,并与重载进行对比
- 向上转型与向下转型: 明白了向上整型的初始化以及不同的使用场景,向下转型的 instanceof 检验运用
- 多态的实现: 理解多态的概念,以及多态的实际运用和使用特点
- 多态的优缺点:多态的优点的多个典型栗子说明,以及多态的缺点的不规范使用的详解
如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正
希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖
相关文章:

面向对象编程第三式: 多态 (Java篇)
本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…...

[数据集][目标检测]草莓成熟度检测数据集VOC+YOLO格式412张3类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):412 标注数量(xml文件个数):412 标注数量(txt文件个数):412 标注类别…...

浅谈HTTP 和 HTTPS (中间人问题)
前言 由于之前的文章已经介绍过了HTTP , 这篇文章介绍 HTTPS 相对于 HTTP 做出的改进 开门见山: HTTPS 是对 HTTP 的加强版 主要是对一些关键信息 进行了加密 一.两种加密方式 1.对称加密 公钥 明文 密文 密文 公钥 明文 2.非对称加密 举个例子就好比 小区邮箱 提供一…...

JAVA八股文面经问题整理第3弹
文章目录 目录 文章目录 提问问题 问题1 问题2 问题3 问题4 问题5 问题6 问题7 问题8 问题9 问题10 问题11 问题12 问题13 问题14 问题15 问题16 问题17 问题18 写在最后 提问问题 JVM类加载机制?nginx怎么做到负载均衡?HashMap的红⿊树和扩容机制&…...

python 爬取人民新闻
基础信息获取: 要闻url:https://www.gov.cn/yaowen/liebiao/home.htm 下一页的url:https://www.gov.cn/yaowen/liebiao/home_1.htm 基础代码: import re import openpyxl import requests from lxml import etree import osdef …...

蓝桥杯刷题(九)
1.三国游戏 代码 #输入数据 nint(input()) Xlilist(map(int,input().split())) Ylilist(map(int,input().split())) Zlilist(map(int,input().split())) #分别计算X-Y-Z/Y-Z-X/Z-X-Y并排序 newXli sorted([Xli[i] - Yli[i] - Zli[i] for i in range(n)],reverseTrue) newYli …...

【NTN 卫星通信】 车辆物联网设备通过NTN和TN切换的应用场景
1 场景描述 对于有两个3GPP无线接入网服务的大面积农田和农场,物联网设备可以通过NTN和TN接入网同时受益于5G系统的双转向数据连接能力。 在这个用例中,我们有一个广域的农业自动化应用系统来控制农业车辆,例如,一个装有数百个…...

html5cssjs代码 014 布局框架
html5&css&js代码 014 布局框架 一、代码二、解释三、Bootstrap框架简介 Bootstrap 是一个流行的开源前端开发框架,它由Twitter公司(后独立为Bootstrap团队)创建并维护。Bootstrap 提供了一套现成的、响应式的用户界面组件和设计布局…...

[EFI]Lenovo Ideapad 530S-14IKB电脑 Hackintosh 黑苹果efi引导文件
硬件型号驱动情况主板 Lenovo Ideapad 530S-14IKB 处理器Intel i5 8250U✅已驱动内存8 GB DDR4 2400 MHz✅已驱动硬盘250 GB SSD M.2 PCI-E✅已驱动显卡Intel UHD Graphics 620✅已驱动声卡暂无更多详细信息✅已驱动网卡Realtek RTL8111✅已驱动无线网卡蓝牙DW1560 (BCM94352Z)…...

FFmpeg-aac、h264封装flv及时间转换
文章目录 时间概念流程api核心代码 时间概念 dts: 解码时间戳, 表示压缩帧的解码时间 pts: 显示时间戳, 表示将压缩帧解码后得到的原始帧的显示时间 时间基: time_base , 通常以ms为单位 时间戳: timestamp , 多少个时间基 真实时间:time_base * timest…...

TCP并发模型 || select || poll || epoll
TCP并发模型: 1.TCP多线程模型: 缺点: 1.创建线程会带来资源开销,能够实现的并发量比较有限 2.IO模型: 1.阻塞IO: 没有数据到来时,可以让任务挂起,节省CPU资源开销,提高系统效率 2.非阻塞IO: 程序未接收到数据时一直执行,效率很低 3…...

【开源】SpringBoot框架开发房屋出售出租系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 房屋销售模块2.2 房屋出租模块2.3 预定意向模块2.4 交易订单模块 三、系统展示四、核心代码4.1 查询房屋求租单4.2 查询卖家的房屋求购单4.3 出租意向预定4.4 出租单支付4.5 查询买家房屋销售交易单 五、免责说明 一、摘…...

STM32的简单介绍
STM32是一种基于ARM Cortex-M内核的32位微控制器,由意法半导体公司开发和生产。STM32具有丰富的外设和功能,适用于各种应用场合,如工业控制、消费电子、物联网、人机交互等。STM32的优势包括低功耗、高性能、高可靠性、易于开发等。STM32的系…...

浏览器同源策略及跨域问题
同源策略:同源策略是一个重要的安全策略,它用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介。 同源策略的作用:保护浏览器中网站的安全,限制ajax只…...

【读书笔记】知识图谱概述
1、KG定义 1.1 背景知识 人工智能分为三个层次,分别是运算智能,感知智能和认知智能。运算智能是让机器能存会算;感知智能是让机器能听会说、能看会认;认知智能是解决机器能理解会思考的问题。由于知识图谱的数据组织方式是计算机…...

用尾插的思路实现 “合并两个有序链表”
一、题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 [], l2 [] 输出&#…...

大数据 - Spark系列《十四》- spark集群部署模式
Spark系列文章: 大数据 - Spark系列《一》- 从Hadoop到Spark:大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 大数据 - Spark系列《…...

考研C语言复习进阶(2)
目录 1. 字符指针 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 4. 函数指针 5. 函数指针数组 6. 指向函数指针数组的指针 7. 回调函数 8.三步辗转法 9. 指针和数组笔试题解析 10. 指针笔试题 指针的主题,我们在初级阶段的《指…...

设计模式学习笔记 - 设计原则与思想总结:1.总结回顾面向对象、设计原则、编程规范、重构技巧等知识点
概述 对前面的内容的回顾,温故而知新,包括:面向对象、设计原则、规范与重构三个模块的内容。 1.代码质量评判标准 如何评价代码质量的高低? 代码质量的评价具有很强的主观性,描述代码质量的词汇也有很多,…...

WPF图表库LiveCharts的使用
这个LiveCharts非常考究版本,它有非常多个版本,.net6对应的是LiveChart2 我这里的wpf项目是.net6,所以安装的是这三个,搜索的时候要将按钮“包括愈发行版”打勾 git:https://github.com/beto-rodriguez/LiveCharts2?…...

第十三届蓝桥杯省赛C++ C组《全题目+题解》
填空题一般都是找规律题目,耐下心来慢慢分析即可。 第一题《排列字母》 【问题描述】 小蓝要把一个字符串中的字母按其在字母表中的顺序排列。 例如,LANQIAO 排列后为AAILNOQ。 又如,GOODGOODSTUDYDAYDAYUP 排列后为AADDDDDGGOOOOPSTUUYYY。…...

Linux——线程池
目录 线程池的概念 线程池的优点 线程池的实现 【注意】 线程池的线程安全 日志文件的实现 线程池的概念 线程池也是一种池化技术,可以预先申请一批线程,当我们后续有任务的时候就可以直接用,这本质上是一种空间换时间的策略。 如果有任…...

Linux:搭建ntp服务器
我准备两个centos7服务器 一个为主服务器连接着外网,并且搭建了ntp服务给其他主机同步 另外一个没有连接外网,通过第一台设备去同步时间 首先两个服务器都要安装ntp软件 yum -y install ntp 再把他俩的时间都改成别的 左侧的是主服务器,主…...

unity学习(57)——选择角色界面--删除角色2
1.客户端添加点击按钮所触发的事件,在selectMenu界面中增加myDelete函数,当点击“删除角色”按钮时触发该函数的内容。 public void myDelete() {string message nowPlayer.id;//string m Coding<StringDTO>.encode(message);NetWorkScript.get…...

Flutter:构建美观应用的跨平台方案
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

【深度学习模型移植】用torch普通算子组合替代torch.einsum方法
首先不得不佩服大模型的强大之处,在算法移植过程中遇到einsum算子在ONNX中不支持,因此需要使用普通算子替代。参考TensorRT - 使用torch普通算子组合替代torch.einsum爱因斯坦求和约定算子的一般性方法。可以写出简单的替换方法,但是该方法会…...

鸿蒙 Harmony 初体验
前言 看现在网上传得沸沸扬扬的鸿蒙,打算弄个 hello world 玩一下, 不然就跟不上时代的发展了 环境安装 我的环境 Windows 11 家庭中文版HarmonyOS SDK (API 9)DevEco Studio (3.1.1 Release)Node.js (16.19.1) 开发IDE下载 官方下载链接 配置 nodejs 这里帮…...

Jmeter+ant,ant安装与配置
1.ant含义 ant:Ant翻译过来是蚂蚁的意思,在我们做接口测试的时候,是可以用来做JMeter接口测试生成测试报告的工具 2.ant下载 下载地址:Apache Ant - Ant Manual Distributions download中选择ant 下载安装最新版zip文件 3.…...

【MySQL基础】MySQL基础操作三
文章目录 🍉1.联合查询🥝笛卡尔积 🍉2.内连接🥝查询单个数据🥝查询多个数据 🍉3.外连接🍉4.自连接🍉5.合并查询 🍉1.联合查询 🥝笛卡尔积 实际开发中往往数…...

【K8s】肿么办??Kubernetes Secrets并不是Secret哟!!
【K8s】肿么办??Kubernetes Secrets并不是Secret哟!! 目录 【K8s】肿么办??Kubernetes Secrets并不是Secret哟!!Kubernetes Secrets为什么不认为 Base64 编码是密文?问题出现了以下是几种加密 K8s Secrets 的选项。Bitnami Sealed Secrets 介绍Bitnami Sealed Secrets…...