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

面向对象编程第三式: 多态 (Java篇)

本篇会加入个人的所谓‘鱼式疯言’

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

在这里插入图片描述

前言

在前面两篇文章中,小编带着友友们详细的熟悉了我们面向对象的前两式-------- 封装, 继承

而在本篇文章中小编讲带着小伙伴具体走进咱们第三式: 多态

竟然都进入第三式了, 我们的难度也会加大哦,小伙伴们一定要认真的阅读小编的讲解哦 💖 💖 💖

还是老规矩,小伙伴们从目录开始吧 💖 💖 💖

目录

  1. 重写
  2. 向上转型与向下转型
  3. 多态的实现
  4. 多态的优缺点

当小编写出第一个小标题的时候,小爱同学就问了,

我们不是讲多态吗? 怎么变成重写了,那重写是什么? 向下转型和向上转型又什么呢?

浅浅和小伙伴先透露一下哦,我们要实现多态就需要两个原理:

一个是 重写

另外一个就是我们的 向上转型

所以让小编带着带着循序渐进,脚踏实地的走入多态的海洋哦。 💖 💖 💖

一. 重写

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>. 向上转型的实际运用

小编总结向上转型的三个使用场景

  1. 直接赋值
  2. 方法传参
  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. 必须在 继承体系
  1. 子类必须要对父类中方法进行重写
  1. 通过父类的引用 调用重写的方法

<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. 多态的缺陷

  1. 属性没有多态性

当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性

  1. 构造方法没有多态性

见如下代码

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方法。

鱼式疯言

结论:

“用尽量简单的方式使对象进入可工作状态”, 尽量不要在
构造器中调用方法

(如果这个方法被子类重写, 就会触发动态绑定, 但是此时子类对象还没构造完成)

可能会出现一些隐藏的但是又极难发现的问题.

总结

  1. 重写: 理解了重写是在什么前提下进行,并与重载进行对比
  2. 向上转型与向下转型: 明白了向上整型的初始化以及不同的使用场景,向下转型的 instanceof 检验运用
  3. 多态的实现: 理解多态的概念,以及多态的实际运用和使用特点
  4. 多态的优缺点:多态的优点的多个典型栗子说明,以及多态的缺点的不规范使用的详解

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

相关文章:

面向对象编程第三式: 多态 (Java篇)

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

[数据集][目标检测]草莓成熟度检测数据集VOC+YOLO格式412张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;412 标注数量(xml文件个数)&#xff1a;412 标注数量(txt文件个数)&#xff1a;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类加载机制&#xff1f;nginx怎么做到负载均衡&#xff1f;HashMap的红⿊树和扩容机制&…...

python 爬取人民新闻

基础信息获取&#xff1a; 要闻url&#xff1a;https://www.gov.cn/yaowen/liebiao/home.htm 下一页的url&#xff1a;https://www.gov.cn/yaowen/liebiao/home_1.htm 基础代码&#xff1a; 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无线接入网服务的大面积农田和农场&#xff0c;物联网设备可以通过NTN和TN接入网同时受益于5G系统的双转向数据连接能力。   在这个用例中&#xff0c;我们有一个广域的农业自动化应用系统来控制农业车辆&#xff0c;例如&#xff0c;一个装有数百个…...

html5cssjs代码 014 布局框架

html5&css&js代码 014 布局框架 一、代码二、解释三、Bootstrap框架简介 Bootstrap 是一个流行的开源前端开发框架&#xff0c;它由Twitter公司&#xff08;后独立为Bootstrap团队&#xff09;创建并维护。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 &#xff0c; 通常以ms为单位 时间戳: timestamp , 多少个时间基 真实时间&#xff1a;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位微控制器&#xff0c;由意法半导体公司开发和生产。STM32具有丰富的外设和功能&#xff0c;适用于各种应用场合&#xff0c;如工业控制、消费电子、物联网、人机交互等。STM32的优势包括低功耗、高性能、高可靠性、易于开发等。STM32的系…...

浏览器同源策略及跨域问题

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

【读书笔记】知识图谱概述

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

用尾插的思路实现 “合并两个有序链表”

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

大数据 - Spark系列《十四》- spark集群部署模式

Spark系列文章&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-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. 指针笔试题 指针的主题&#xff0c;我们在初级阶段的《指…...

设计模式学习笔记 - 设计原则与思想总结:1.总结回顾面向对象、设计原则、编程规范、重构技巧等知识点

概述 对前面的内容的回顾&#xff0c;温故而知新&#xff0c;包括&#xff1a;面向对象、设计原则、规范与重构三个模块的内容。 1.代码质量评判标准 如何评价代码质量的高低&#xff1f; 代码质量的评价具有很强的主观性&#xff0c;描述代码质量的词汇也有很多&#xff0c…...

WPF图表库LiveCharts的使用

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

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...