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

协会秘书处工作建设 网站百度正版下载并安装

协会秘书处工作建设 网站,百度正版下载并安装,汕头网站建设推广价格,服务称赞的项目管理平台目录 碎碎念 ChatGPT 中出现的问题 那么正确答案应该是什么呢#xff1f; 分派的相关知识点总结#xff1a; 分派是什么#xff1f; 静态分派与动态分派#xff1a; Java语言是静态多分派#xff0c;动态单分派的#xff1b; 静态分派#xff1a;静态重载多分派…目录 碎碎念 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为例按照charintlongdoublefloatdoubleCharacterSerializableObject...(变长参数将其视为一个数组元素)变长参数的重载优先级最低注意char到byte或short之间的转换时不安全的基本类型与基本类型之间存在自动类型转换基本类型到包装类型之间存在自动装箱java.lang.Serializable是java.lang.Character类实现的一个接口Character是绝对不会转型为Integer的它只能安全地转型为它实现的接口或父类Character还实现了另外一个接口java.lang.ComparableCharacter如果同时出现两个参数分别为Serializable和 ComparableCharacter的重载方法那它们在此时的优先级是一样的编译器无法确定要自动转型为哪种类型会提示“类型模糊”Type Ambiguous并拒绝编译但是如果绕过Javac编译器自己去构造出表达相同语义的字节码将会发现这是能够通过Java虚拟机的类加载校验而且能够被Java虚拟机正常执行的但是会选择Serializable还是ComparableCharacter的重载方法则并不能事先确定这是《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为例按照charintlongdoublefloatdoubleCharacterSerializableObject...(变长参数将其视为一个数组元素) 例题二重载方法匹配优先级(引用类型) 请分析如下程序的运行结果 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));} } A. 这段程序有编译错误B. 语句1输出为:Hello, tommyC. 语句2输出为:Hello, tommyD. 语句1输出为:Welcome, tommyE. 语句2输出为:Welcome, tommyF. 根据选用的Java编译器不同这段程序的输出可能不同 运行结果 正确答案: C D  解题关键 相信懂了书里面5个较难例子的你肯定做对啦所以也就不讲啦 ChatGPT的出现引发的思考 ChatGPT作为一个超强的AI或许能取代一部分程序员但是正所谓”智者千虑必有一失愚者千虑必有一得“在学习和生活中要不断思考深挖才会有更多的价值 并且现在ChatGPT已经能输出图片并且也接入了一些聊天软件 可以看出虽然ChatGPT能够根据文字描述生成大体符合要求的图片但是一些细节问题仍有较大的发展空间之前我还担心有了ChatGPT我的研究生方向人脸超分辨率恢复与重建会不会变的没有意义现在看来会有意义至少在我毕业之前仍会存在异议从上图中可以看出虽然ChatGPT能够生成大概的场景但是对人脸五官的细节恢复十分差劲 乐一下让ChatGPT扮演服务端开发人员看他自己对ChatGPT有什么看法 参考文献 《深入理解Java虚拟机JVM高级特性与最佳实践第3版周志明》ChatGPT
http://www.sczhlp.com/news/245289/

相关文章:

  • 免费网站正能量入口下载万能优化大师下载
  • 网站不收录 域名问题手机网站展示
  • 网站建设论文中期总结做网站需要跟客户了解什么
  • 10/30观后感
  • [CEOI 2020] 星际迷航
  • Chome插件Mathpix Snip对SDU信息服务平台的会话阻塞问题
  • 2025.10.30总结
  • AT_arc068_d [ARC068F] Solitaire 分析
  • 太原cms建站模板做团购网站需要多少钱
  • 宁波企业网站优化推广wordpress 多图上传插件
  • 海拉尔网站设计网站有哪些费用多少
  • 外贸网站一站式海外推广最优惠的网站优化
  • 徐州市建设局招投标网站云vps怎么搭建网站
  • 网站开发端口查询王也头像超清晰
  • 加强财政门户网站建设工作企业网站建设文档
  • 上海做机床的公司网站互联网推广引流是做什么的
  • 网站建设公司的介绍电子书网站搭建教程
  • 建行官方网站 - 百度域名被锁定网站打不开
  • 广西南宁网站公司网站意识形态建设
  • 易企秀做的网站Wordpress百万数据查询多久
  • 网站制作外包公司网站制作完成之后进入了什么阶段
  • 手机浏览器网站开发工具wordpress调用当前页面链接
  • 南京企业网站国家开发公司
  • 黄石网站建设哪家好制作图片的软件及特点
  • 北京品牌建设网站公司排名企业网站建设收费
  • 昆明做一个公司网站多少费用杭州市住房与城乡建设部网站
  • 网站开发有哪几种语言深圳小程序开发定制公司
  • 网站建设时间推进表模板怎样建外贸公司网站
  • 做阿里还是网站建网站做代理ip
  • 598网站建设深圳市昊客网络科技有限公司