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

ChatGPT似乎有的时候并不能搞懂Java的动态分派,你懂了吗?

目录

碎碎念

ChatGPT 中出现的问题

那么正确答案应该是什么呢?

分派的相关知识点总结:

分派是什么?

静态分派与动态分派:

Java语言是静态多分派,动态单分派的;

静态分派:静态重载多分派:

动态分派:动态重写单分派:

多分派类型与单分派类型

例题

例题一:重载方法匹配优先级(基本类型):

请分析如下程序的运行结果:

运行结果:

解题关键:

例题二:重载方法匹配优先级(引用类型):

请分析如下程序的运行结果:

运行结果:

解题关键:

例题三:动态分派

请分析如下程序的运行结果:

运行结果:

解题关键:

例题四:动态分派

请分析如下程序的运行结果:

运行结果:

解题关键:

例题五:单分派和多分派:

请分析如下程序的运行结果:

运行结果:

解题关键:

例题六:【用友笔试】

根据下面这个程序的内容,判断哪些描述是正确的:( )

运行结果:

解题关键:

ChatGPT的出现引发的思考

乐一下,让ChatGPT扮演服务端开发人员,看他自己对ChatGPT有什么看法:

参考文献

碎碎念

近期英子姐推荐了一本有关JVM的书,所以最近在看这个,发现,之前看的好多八股都是从这里出来的,收益颇多(虽然不一定能记住,但是看了总比不看强,或许看多了就记住了);

这本书的名字叫:《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)周志明》,本来是边看,不懂的就跟ChatGPT讨论,ChatGPT绝大多数时候都是靠谱的,直到第八章 虚拟机字节码执行引擎中的8.3 方法调用中的8.3.2分派这一节出现了一点问题,ChatGPT似乎有的时候并不能搞懂Java的动态分派;

PS:本来这个文章是周四晚上立的,准备周五写的flag,但是由于种种原因拖到了周日晚上,好在是在临近周一之前完成了

ChatGPT 中出现的问题

书中讲完动态分派之后,举了两个例子,ChatGPT就是在这第二个例子上翻车了,翻车实况见下图:

发现他说的有有问题之后,又让他改了两次,但可以,ChatGPT并没有把握住机会(doge)

 

那么正确答案应该是什么呢?

正确的输出结果应该是:

I am Son, i have $0
I am Son, i have $4
This gay has $2

原因如下:

  • 输出两句都是“I am Son”,这是因为Son类在创建的时候,首先隐式调用了Father的构造函数,而Father构造函数中对showMeTheMoney()的调用是一次虚方法调用,实际执行的版本是Son::showMeTheMoney()方法,所以输出的是“I am Son”;
    • 如果是父类与子类之间的重写方法的选择,则是使用动态类型
      • (如果有多个父类,那么接近上层的优先级越低)
    • 如果你想简单的理解,那就记住上面的话,动态重写多分派,因为是重写,所以这里用动态分派,所以接近上层的优先级越低,所以这里调用的是Son类中重写的方法;
  • 而这时候虽然父类的money字段已经被初始化成2了,但Son::showMeTheMoney()方法中访问的却是子类的money字段,这时候结果自然还是0,因为它要到子类的构造函数执行时才会被初始化;
    • 这里可能有人会乱套,乱套不要怕,直接IDEA debug!
  • 走完父类的构造方法,那就回到子类中继续往下走,这个应该没啥问题,就正常的赋值,调用重写方法;
  • 至此,new Son() 结束;
  • main()的最后一句通过静态类型访问到了父类中的money,输出了2;

那么让我们一起重新复习一下分派的知识点吧!

分派的相关知识点总结:

分派是什么?

  • Java中的分派(Dispatch)指的是根据方法的接收者和参数的实际类型,选择正确的方法实现的过程;
  • Java中的分派主要包括静态分派和动态分派两种类型。
    • 静态分派(Static Dispatch):
      • 发生在编译期间,由编译器根据方法接收者和参数的静态类型确定具体调用的方法实现。例如,如果在代码中定义了一个方法,它的参数是Object类型,但在调用时传入了一个String类型的实例,编译器会选择Object类型的方法实现。
    • 动态分派(Dynamic Dispatch):
      • 发生在运行期间,由Java虚拟机根据方法接收者的实际类型确定具体调用的方法实现。例如,如果在代码中定义了一个父类和一个子类,它们都有一个同名的方法,在运行时调用子类实例的方法时,Java虚拟机会选择子类的方法实现。
  • Java中的分派是基于多态的概念实现的。多态指的是同一操作作用于不同的对象,可以有不同的解释和不同的实现方式。在Java中,通过使用继承和重写方法实现多态。

静态分派与动态分派:

Java语言是静态多分派,动态单分派的;

  • 如果是重载方法之间的选择,则是使用静态类型
  • 如果是父类与子类之间的重写方法的选择,则是使用动态类型
  • (如果有多个父类,那么接近上层的优先级越低)
  • A a = new B(); 会使用类型B去查找重写的方法,使用类型A去查找重载的方法
  • 静态分派发生在编译期间,根据参数的静态类型来决定选择哪个重载方法;
  • 动态分派发生在运行期间,根据对象的实际类型来决定调用哪个重写方法;

静态分派:静态重载多分派

  • 静态分派(《Thinking In Java》中称之为静态绑定(前期绑定)):
    • 所有依赖静态类型来定位方法执行版本(版本即哪一个方法)的分派动作,静态分派的最典型的应用就是方法重载;
  • 静态类型在编译期是可知的;
  • 1)基本类型(包装类型):
    • 以char为例,按照char>int>long>double>float>double>Character>Serializable>Object>...(变长参数,将其视为一个数组元素)
    • 变长参数的重载优先级最低;
    • (注意char到byte或short之间的转换时不安全的)
    • 基本类型与基本类型之间存在自动类型转换;
    • 基本类型到包装类型之间存在自动装箱;
    • java.lang.Serializable是java.lang.Character类实现的一个接口;
    • Character是绝对不会转型为Integer的,它只能安全地转型为它实现的接口或父类;Character还实现了另外一个接口java.lang.Comparable<Character>,如果同时出现两个参数分别为Serializable和 Comparable<Character>的重载方法,那它们在此时的优先级是一样的;编译器无法确定要自动转型为哪种类型,会提示“类型模糊”(Type Ambiguous),并拒绝编译;但是如果绕过Javac编译器,自己去构造出表达相同语义的字节码,将会发现这是能够通过Java虚拟机的类加载校验,而且能够被Java虚拟机正常执行的,但是会选择Serializable还是Comparable<Character>的重载方法则并不能事先确定,这是《Java虚拟机规范》所允许的;
    • 【注意】有一些在单个参数中能成立的自动转型,如char转型为int,在变长参数中是不成立的;
  • 2)引用类型:
    • 则需要根据继承关系进行匹配,注意只跟其编译时类型即静态类型相关;
    • 如果是重载方法之间的选择,则是使用静态类型

动态分派:动态重写单分派

  • 如果是父类与子类之间的重写方法的选择,则是使用动态类型
    • (如果有多个父类,那么接近上层的优先级越低)
  • 动态分派(《Thinking In Java》中称之为动态绑定(后期绑定)):
    • 在运行期根据实际类型确定执行版本的分派过程称为动态分派,这是重写的实际本质,在重写过程中并不是唯一的版本,而是选择更加合适的版本(如果有多个父类,那么接近上层的优先级越低);

多分派类型与单分派类型

  • 多分派类型:
    • 根据一个以上的宗量(方法的接受者与方法的参数统称为方法的宗量)进行方法的选择方法的分派类型;其中静态分派属于多分派类型;即Father father = new Son(); father.overloadMethod(param),中overloadMethod()方法的选择是要根据静态类型Father与方法的参数param共同确定的;
  • 单分派类型:
    • 动态分配属于单分派类型,即只会根据实际类型Son选择方法
  • 总结:
    • 静态多分派,动态单分派的语言

或许看完很抽象,所以应该结合例子看,例子如下!

例题

例题将包括5个书上的,和一个笔试题

例题一:重载方法匹配优先级(基本类型):

请分析如下程序的运行结果:

package org.fenixsoft.polymorphic;
public class Overload {public static void sayHello(Object arg) {System.out.println("hello Object");}public static void sayHello(int arg) {System.out.println("hello int");}public static void sayHello(long arg) {System.out.println("hello long");}public static void sayHello(Character arg) {System.out.println("hello Character");}public static void sayHello(char arg) {System.out.println("hello char");}public static void sayHello(char... arg) {System.out.println("hello char ...");}public static void sayHello(Serializable arg) {System.out.println("hello Serializable");}public static void main(String[] args) {sayHello('a');}
}

运行结果:

hello char

解题关键:

你只需要记住上面说的基本类型静态分派的顺序即可:

以char为例,按照char>int>long>double>float>double>Character>Serializable>Object>...(变长参数,将其视为一个数组元素)

例题二:重载方法匹配优先级(引用类型):

请分析如下程序的运行结果:

public class StaticDispatch {static abstract class Human {}static class Man extends Human {}static class Woman extends Human {}public void sayHello(Human guy) {System.out.println("hello,guy!");}public void sayHello(Man guy) {System.out.println("hello,gentleman!");}public void sayHello(Woman guy) {System.out.println("hello,lady!");}public static void main(String[] args) {Human man = new Man();Human woman = new Woman();StaticDispatch sr = new StaticDispatch();sr.sayHello(man);sr.sayHello(woman);}
}

运行结果:

hello,guy!
hello,guy!

解题关键:

  • Java语言是静态多分派,动态单分派的;
    • 如果是重载方法之间的选择,则是使用静态类型
    • 如果是父类与子类之间的重写方法的选择,则是使用动态类型
      • (如果有多个父类,那么接近上层的优先级越低)
    • 如A a = new B(); 会使用类型B去查找重写的方法,使用类型A去查找重载的方法;

例题三:动态分派

请分析如下程序的运行结果:

public class DynamicDispatch {static abstract class Human {protected abstract void sayHello();}static class Man extends Human {@Overrideprotected void sayHello() {System.out.println("man say hello");}}static class Woman extends Human {@Overrideprotected void sayHello() {System.out.println("woman say hello");}}public static void main(String[] args) {Human man = new Man();Human woman = new Woman();man.sayHello();woman.sayHello();man = new Woman();man.sayHello();}
}

运行结果:

man say hello
woman say hello
woman say hello

解题关键:

  • 在Java里面只有虚方法存在,字段永远不可能是虚的,换句话说,字段永远不参与多态,哪个类的方法访问某个名字的字段时,该名字指的就是这个类能看到的那个字段;当子类声明了与父类同名的字段时,虽然在子类的内存中两个字段都会存在,但是子类的字段会遮蔽父类的同名字段;

例题四:动态分派

请分析如下程序的运行结果:

public class FieldHasNoPolymorphic {static class Father {public int money = 1;public Father() {money = 2;showMeTheMoney();}public void showMeTheMoney() {System.out.println("I am Father, i have $" + money);}}static class Son extends Father {public int money = 3;public Son() {money = 4;showMeTheMoney();}public void showMeTheMoney() {System.out.println("I am Son, i have $" + money);}}public static void main(String[] args) {Father gay = new Son();System.out.println("This gay has $" + gay.money);}
}

运行结果:

I am Son, i have $0
I am Son, i have $4
This gay has $2

解题关键:

  • 输出两句都是“I am Son”,这是因为Son类在创建的时候,首先隐式调用了Father的构造函数,而Father构造函数中对showMeTheMoney()的调用是一次虚方法调用,实际执行的版本是Son::showMeTheMoney()方法,所以输出的是“I am Son”;
    • 如果是父类与子类之间的重写方法的选择,则是使用动态类型
      • (如果有多个父类,那么接近上层的优先级越低)
    • 如果你想简单的理解,那就记住上面的话,动态重写多分派,因为是重写,所以这里用动态分派,所以接近上层的优先级越低,所以这里调用的是Son类中重写的方法;
  • 而这时候虽然父类的money字段已经被初始化成2了,但Son::showMeTheMoney()方法中访问的却是子类的money字段,这时候结果自然还是0,因为它要到子类的构造函数执行时才会被初始化;
    • 这里可能有人会乱套,乱套不要怕,直接IDEA debug!
  • 走完父类的构造方法,那就回到子类中继续往下走,这个应该没啥问题,就正常的赋值,调用重写方法;
  • 至此,new Son() 结束;
  • main()的最后一句通过静态类型访问到了父类中的money,输出了2;

例题五:单分派和多分派:

请分析如下程序的运行结果:

public class Dispatch {static class QQ {}static class _360 {}public static class Father {public void hardChoice(QQ arg) {System.out.println("father choose qq");}public void hardChoice(_360 arg) {System.out.println("father choose 360");}}public static class Son extends Father {public void hardChoice(QQ arg) {System.out.println("son choose qq");}public void hardChoice(_360 arg) {System.out.println("son choose 360");}}public static void main(String[] args) {Father father = new Father();Father son = new Son();father.hardChoice(new _360());son.hardChoice(new QQ());}
}

运行结果:

father choose 360
son choose qq

解题关键:

  • 在Java语言中,方法的选择过程包括两个阶段:静态分派和动态分派;
  • 静态分派发生在编译期间,根据参数的静态类型来决定选择哪个重载方法;而动态分派发生在运行期间,根据对象的实际类型来决定调用哪个重写方法;
  • 在本例中,静态分派选择的目标方法签名是hardChoice(QQ)和hardChoice(_360),但实际执行的方法取决于运行时对象的实际类型;
  • 因此,father.hardChoice(new _360())调用了Father类中的hardChoice(_360)方法,而son.hardChoice(new QQ())调用了Son类中的hardChoice(QQ)方法;
  • 由于动态分派的目标方法只与接收者的实际类型有关,而与参数的类型无关,因此Java语言的动态分派属于单分派类型;

例题六:【用友笔试】

根据下面这个程序的内容,判断哪些描述是正确的:( )

public class Test {public static void main(String args[]) {String s = "tommy";Object o = s;sayHello(o); //语句1sayHello(s); //语句2}public static void sayHello(String to) {System.out.println(String.format("Hello, %s", to));}public static void sayHello(Object to) {System.out.println(String.format("Welcome, %s", to));}
}
  1. A. 这段程序有编译错误
  2. B. 语句1输出为:Hello, tommy
  3. C. 语句2输出为:Hello, tommy
  4. D. 语句1输出为:Welcome, tommy
  5. E. 语句2输出为:Welcome, tommy
  6. F. 根据选用的Java编译器不同,这段程序的输出可能不同

运行结果:

正确答案: C D 

解题关键:

相信懂了书里面5个较难例子的你,肯定做对啦,所以也就不讲啦!

ChatGPT的出现引发的思考

ChatGPT作为一个超强的AI,或许能取代一部分程序员,但是正所谓”智者千虑必有一失,愚者千虑必有一得“,在学习和生活中要不断思考,深挖才会有更多的价值!

并且现在ChatGPT已经能输出图片,并且也接入了一些聊天软件

可以看出,虽然ChatGPT能够根据文字描述生成大体符合要求的图片,但是一些细节问题仍有较大的发展空间,之前我还担心有了ChatGPT我的研究生方向:人脸超分辨率恢复与重建会不会变的没有意义,现在看来,会有意义,至少在我毕业之前仍会存在异议,从上图中可以看出,虽然ChatGPT能够生成大概的场景,但是对人脸五官的细节恢复十分差劲;

乐一下,让ChatGPT扮演服务端开发人员,看他自己对ChatGPT有什么看法:

参考文献

  • 《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)周志明》
  • ChatGPT

相关文章:

ChatGPT似乎有的时候并不能搞懂Java的动态分派,你懂了吗?

目录 碎碎念 ChatGPT 中出现的问题 那么正确答案应该是什么呢&#xff1f; 分派的相关知识点总结&#xff1a; 分派是什么&#xff1f; 静态分派与动态分派&#xff1a; Java语言是静态多分派&#xff0c;动态单分派的&#xff1b; 静态分派&#xff1a;静态重载多分派…...

【C++初阶】vector的模拟实现

大家好我是沐曦希&#x1f495; 文章目录一、前言二、无参构造&析构三、基础接口1.empty和clear2.size和capacity3.[]和iterator四、reserve和resize五、尾插尾删六、其他构造1.迭代器区间构造2.拷贝构造七、memcpy问题八、完整代码一、前言 在模拟实现容器时候&#xff0…...

微信小程序、小游戏的流量主一般可以赚多少钱?

本篇文章主要科普小程序、小游戏流量主一般赚钱的实际情况&#xff0c;通过在下长期运营的经验汇总而成。 日期&#xff1a;2023年2月26日 作者&#xff1a;任聪聪 小程序、小程序满1000用户后即可开通流量主&#xff0c;但实际上很多人并没有传说中的那种日赚几千的流量收入的…...

jni-Demo-基于linux(c++ java)

跑一个jni 的最简单的Demo需要提前准备 VsCode 编译器、win10下&#xff0c;vscode中集成linux操作系统、c编译器&#xff08;gcc、g&#xff09;&#xff0c;java编译器&#xff08;jdk1.8&#xff09;参考&#xff1a;https://mangocool.com/1653030123842.htmlJniDemo类&…...

指针的进阶——(1)

本次讲解重点&#xff1a; 1、字符指针 2、数组指针 3、指针数组 4、数组传参和指针传参 5、函数指针 关于指针这个知识点的主题&#xff0c;我们在前面已经初级阶段已经对指针有了大致的理解和应用了。我们知道了指针的概念&#xff1a; 1、指针就是地址&#xff0c;但口…...

电商平台的促销活动如何抵御大流量的ddos攻击

每一次活动大促带来的迅猛流量&#xff0c;对技术人而言都是一次严峻考验。如果在活动期间遭受黑产恶意 DDoS 攻击&#xff0c;无疑是雪上加霜。电商的特性是业务常态下通常不会遭受大流量 DDoS 攻击&#xff0c;且对延迟敏感&#xff0c;因此只需要在活动期间按需使用 DDoS 防…...

代码随想录-48-104. 二叉树的最大深度

目录前言题目1.层序迭代思路2. 本题思路分析&#xff1a;3. 算法实现4. pop函数的算法复杂度5. 算法坑点前言 在本科毕设结束后&#xff0c;我开始刷卡哥的“代码随想录”&#xff0c;每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。 代码随想录此题链接 …...

【Vue3源码】第六章 computed的实现

【Vue3源码】第六章 computed的实现 上一章节我们实现了 ref 及其它配套的isRef、unRef 和 proxyRefs API。这一章开始实现computed计算属性。 认识computed 接受一个 getter 函数&#xff0c;返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。…...

Java基础之注解

3.注解 3.1概述【理解】 概述 对我们的程序进行标注和解释 注解和注释的区别 注释: 给程序员看的注解: 给编译器看的 使用注解进行配置配置的优势 代码更加简洁,方便 3.2自定义注解【理解】 格式 public interface 注解名称 { ​ public 属性类型 属性名() default 默认值…...

三、线性表

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 自学JAVA数据结构笔记&#xff0c;跟学视频为&#xff1a;黑马程序员Java数据结构与java算法全套教程…...

C++统计方形

统计方形 内存限制&#xff1a;256 MB 时间限制&#xff1a;1 S 题目描述 有一个n*m方格的棋盘&#xff0c;求其方格包含多少正方形、长方形&#xff08;此处长方形不包含正方形&#xff09; 输入格式 输入存在多组测试数据。每组测试数据输入两个整数n,m&#xff0c;数字不超…...

Tina_Linux配网开发指南

OpenRemoved_Tina_Linux_配网_开发指南 1 概述 1.1 编写目的 介绍Allwinner 平台上基于wifimanager-v2.0 的WiFi 配网方式&#xff0c;包括softap(WiFi ap 模式热点配网),soundwave(声波配网),BLE(蓝牙低功耗配网)。 1.2 适用范围 • allwinner 软件平台tina v5.0 版本及以…...

高频面试题|RabbitMQ如何防止消息的重复消费?

一. 前言最近有很多小伙伴开始找工作&#xff0c;在面试时&#xff0c;面试官经常会问我们这样一个题目&#xff1a;RabbitMQ如何防止重复消费?有很多小伙伴这个时候都在想&#xff0c;消息怎么还会重复消费呢???.......所以他们在面试后就跑来问壹哥&#xff0c;针对这个比…...

黑盒测试用例设计方法-边界值分析法

目录 一、边界值定义 二、边界值的考虑 三、边界值的优化 四、边界值的设计用例的步骤 五、案例 六、边界值的类型 一、边界值定义 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下…...

项目风险管理中不可忽视的5个关键点

1、风险意识非常重要 项目经理必须要有风险意识&#xff0c;并不是项目计划做好就万事大吉&#xff0c;而是需要对项目风险进行预判&#xff0c;时刻保持风险意识&#xff0c;及时发现和处理项目风险。 项目风险管理关键&#xff1a;风险意识​ 2、建立组织风险资产库 寻…...

Linux->进程地址空间

目录 前言&#xff1a; 1. 程序地址空间回顾 2. 进程空间是什么 3. 进程地址空间与内存 4. 进程地址空间和内存的关联 5. 为什么要有进程地址空间 前言&#xff1a; 我们在平时学习的过程当中总是听到栈、堆、代码段等等储存空间&#xff0c;但是这些东西到底是什么&…...

【奶奶看了也不会】AI绘画 Mac安装stable-diffusion-webui绘制AI妹子保姆级教程

1.作品图 2.准备工作 目前网上能搜到的stable-diffusion-webui的安装教程都是Window和Mac M1芯片的&#xff0c;而对于因特尔芯片的文章少之又少&#xff0c;这就导致我们还在用老Intel 芯片的Mac本&#xff0c;看着别人生成美女图片只能眼馋。所以小卷这周末折腾了一天&#…...

基于stm32电梯管理系统设计

基于stm32电梯管理系统设计这里记录一下以前自己做的嵌入式课程设计&#xff0c;报告中的图片和文字太多了&#xff0c;全部一个一个把搬过来太麻烦了,需要完整文本和代码自行q我963160156&#xff0c;也可在微信公众号 *高级嵌入式软件* 里回复 *电梯* 查看完整版文章摘要关键…...

Spring中的FactoryBean 和 BeanFactory、BeanPostProcessor 和BeanFactoryPostProcessor解析

文章目录FactoryBean 和 BeanFactory后置处理器BeanPostProcessor 和 BeanFactoryPostProcessorBeanPostProcessorBeanFactoryPostProcessorFactoryBean 和 BeanFactory BeanFactory接⼝是容器的顶级接⼝&#xff0c;定义了容器的⼀些基础⾏为&#xff0c;负责⽣产和管理Bean的…...

【C++从入门到放弃】类和对象(上)

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《C从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 类和对…...

什么牌子的蓝牙耳机便宜好用?四款高品质蓝牙耳机推荐

随着时代的发展&#xff0c;蓝牙耳机的使用频率越来越高&#xff0c;不少人外出时除了带手机外&#xff0c;蓝牙耳机也成为了外出必备的数码产品之一。现在的蓝牙耳机品牌众多&#xff0c;什么牌子的蓝牙耳机便宜好用&#xff1f;下面&#xff0c;我来给大家推荐四款高品质的蓝…...

eddsa 算法

信息安全课程设计&#xff1a;eddsa 算法 一、项目要求 使用 C 语言开发&#xff1b;可以实现公私钥生成、签名、认证&#xff1b;只需要手动输入明文&#xff0c;代码会自动生成公私钥、签名、认证&#xff1b;记录公私钥生成、签名、认证的时间&#xff1b;在 VS 上运行&am…...

Xcode Developer Document 开发者文档

总目录 iOS开发笔记目录 从一无所知到入门 文章目录IntroDeveloper Documentation 打开方式菜单栏点击 &#xff5c; 快捷键方式另一种打开方式Intro 2016年我在学校学Java的时候&#xff0c;要查某个Java类/方法的用法还得自己手动下载一种.chm格式的开发文档文件&#xff0c…...

IntelliJ插件开发教程之新建项目

JetBrains公司系列产品IDEA、WebStrom、PyCharm、CLion、GoLand等都是基于IntelliJ Platform开发而成&#xff0c;掌握IntelliJ插件开发技能便能拥有提升开发效率的终极武器。本教程Demo源码请微信公众号“开发效率”进行获取。阅读原文如果您是JetBrains产品的用户&#xff0c…...

解决SpringBoot中@RequestBody不能和Multipart同时传递的问题

问题描述 今天在做文件上传的时候&#xff0c;遇到了这么一个错误日志&#xff1a; Resolved[org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘multipart/form-data;boundary--------------------------771899451541318130280588;charsetUTF-8’…...

【华为OD机试模拟题】用 C++ 实现 - 统计匹配的二元组个数(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明统计匹配的二元组个数题目输入输出描述示例一输入输出说明示例二输入输出说明备注Code使用说明 参加华为od机试,一定要注意不要完全背诵代码&...

Vuex 面试题总结 的历史汇总!

一.vuex是什么&#xff1f;怎么使用&#xff1f;哪种功能场景使用它&#xff1f; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。简单来说就是&#xff1a;应用…...

Redis缓存更新策略与缓存穿透、雪崩等问题的解决

文章目录一、缓存更新策略1、三种策略2、策略选择3、主动更新的方案二、缓存存在的问题1、缓存穿透2、缓存雪崩3、缓存击穿三、解决缓存问题1、自定义分布式锁2、解决缓存穿透问题3、解决缓存击穿问题一、缓存更新策略 1、三种策略 内存淘汰&#xff1a;redis自带的内存淘汰机…...

OSI和TCP/IP网络模型细讲

文章目录一、OSI七层参考模型二、TCP/IP体系结构三、TCP/IP参考模型四、沙漏计时器形状的TCP/IP协议族五、两种国际标准对比相似之处不同之处一、OSI七层参考模型 OSI参考模型共分为7层&#xff0c;低三层面向通信&#xff0c;可用软硬件实现&#xff1b;高三层面向信息处理&am…...

【正点原子FPGA连载】第十九章FreeRtos Hello World实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十九章FreeRto…...

荆轲网络做网站/百度收录教程

Android ViewGroup中的Scroller与computeScroll的有什么关系&#xff1f;答&#xff1a;没有直接的关系知道了答案&#xff0c;是不是意味着下文就没必要看了&#xff0c;如果说对ViewGroup自定义控件不感兴趣&#xff0c;可以不用看了。1.Scroller到底是什么&#xff1f;答&am…...

网站制作多少钱方案/推广策划方案怎么做

以下为Obsidian中部分Markdown编辑器的编辑命令格式与其对应的格式显示。 因为Obsidian中的Markdown与CSDN中的Markdown编辑器格式不同&#xff0c;原Markdown格式不能正常显示&#xff0c;所以下面用图片来表示&#xff1a; 为方便查看&#xff0c;我们本次用以下对应的图片来…...

腾讯云做网站需要报备/图片外链工具

DBLE 与 MyCat 对应分片算法名和异同第七种 DBLE分片算法—jumpStringHash除了以上六种常见的分片算法之外&#xff0c;DBLE 还独有一种分片算法&#xff1a;跳跃字符串算法。具体配置如下&#xff1a;#rule.xml20:2partitionCont&#xff1a;分片数量hashSlice&#xff1a;分片…...

电子商务网站建设期末试题答案05/爱站工具网

上节我们讨论了对象的定义和对象的创建&#xff0c;知道了函数也是对象&#xff0c;知道了对象都是由函数创建的&#xff0c;知道了对象的原型和函数的原型属性的关系。这节说一下关于对象属性的操作&#xff0c;下节就可以切入正题了。 属性删除 1 var person {age : 28, tit…...

西宁网络推广公司/seo推广是什么

/// <summary> /// 裁剪字符 /// </summary> /// <param name"input">原始字符串</param> /// <param name"maxLength">最大长度&#xff0c;以中文&#xff08;两个字节&#xff09;为最小单位…...

牛天下网站建设/百度关键词搜索量统计

1多态可以有属性,接口只有方法 2关键字不同,多态有静态多态(abstract)和动态多态(virtual),静态多态不能new()出自己,动态多态可以;多态中可以有自己的方法可设置不需要子类重写,接口则否, 3.基于上述两点发现,多态比接口更宽松,但有时由于接口的单一使得很使用明确,别人用起来…...