今天面试居然选错了一道题

比如:

package com.bjsxt;

public class Test2 {

public void info(Object obj) {
System.out.println("obj");
}

public void info(String str) {
System.out.println("str");
}

/**
* @param args
*/
public static void main(String[] args) {
Test2 T2 = new Test2();
T2.info(null);
}

}打印出:str



解释(主要是重载函数调用时精确性的问题)

《java解惑》

谜题46:令人混淆的构造器案例
本谜题呈现给你了两个容易令人混淆的构造器。main方法调用了一个构造器,但是它调用的到底是哪一个呢?该程序的输出取决于这个问题的答案。那么它到底会打印出什么呢?甚至它是否是合法的呢?

public class Confusing {
private Confusing(Object o) {
System.out.println("Object");
}
private Confusing(double[] dArray) {
System.out.println("double array");
}
public static void main(String[] args) {
new Confusing(null);
}
}

传 递给构造器的参数是一个空的对象引用,因此,初看起来,该程序好像应该调用参数类型为Object的重载版本,并且将打印出Object。另一方面,数组 也是引用类型,因此null也可以应用于类型为double[ ]的重载版本。你由此可能会得出结论:这个调用是模棱两可的,该程序应该不能编译。如果你试着去运行该程序,就会发现这些直观感觉都是不对的:该程序打印 的是double array。这种行为可能显得有悖常理,但是有一个很好的理由可以解释它。
Java的重载解析过程是以两阶段运行的。第一阶段 选取所有可获得并且可应用的方法或构造器。第二阶段在第一阶段选取的方法或构造器中选取最精确的一个。如果一个方法或构造器可以接受传递给另一个方法或构 造器的任何参数,那么我们就说第一个方法比第二个方法缺乏精确性[JLS 15.12.2.5]。

在我们的程序中,两个构造器都是可获得 并且可应用的。构造器Confusing(Object)可以接受任何传递给Confusing(double[ ])的参数,因此Confusing(Object)相对缺乏精确性。(每一个double数组都是一个Object,但是每一个Object并不一定是 一个double数组。)因此,最精确的构造器就是Confusing(double[ ]),这也就解释了为什么程序会产生这样的输出。

如 果你传递的是一个double[ ]类型的值,那么这种行为是有意义的;但是如果你传递的是null,这种行为就有违直觉了。理解本谜题的关键在于在测试哪一个方法或构造器最精确时,这些 测试没有使用实际的参数:即出现在调用中的参数。这些参数只是被用来确定哪一个重载版本是可应用的。一旦编译器确定了哪些重载版本是可获得且可应用的,它 就会选择最精确的一个重载版本,而此时使用的仅仅是形式参数:即出现在声明中的参数。

要想用一个null参数来调用 Confusing(Object)构造器,你需要这样写代码:new Confusing((Object)null)。这可以确保只有Confusing(Object)是可应用的。更一般地讲,要想强制要求编译器选择一 个精确的重载版本,需要将实际的参数转型为形式参数所声明的类型。

以这种方式来在多个重载版本中进行选择是相当令人不快的。在你的API 中,应该确保不会让客户端走这种极端。理想状态下,你应该避免使用重载:为不同的方法取不同的名称。当然,有时候这无法实现,例如,构造器就没有名称,因 而也就无法被赋予不同的名称。然而,你可以通过将构造器设置为私有的并提供公有的静态工厂,以此来缓解这个问题[EJ Item 1]。如果构造器有许多参数,你可以用Builder模式[Gamma95]来减少对重载版本的需求量。

如果你确实进行了重载,那么请确保所有的重载版本所接受的参数类型都互不兼容,这样,任何两个重载版本都不会同时是可应用的。如果做不到这一点,那么就请确保所有可应用的重载版本都具有相同的行为[EJ Item 26]。

总之,重载版本的解析可能会产生混淆。应该尽可能地避免重载,如果你必须进行重载,那么你必须遵守上述方针,以最小化这种混淆。如果一个设计糟糕的API强制你在不同的重载版本之间进行选择,那么请将实际的参数转型为你希望调用的重载版本的形式参数所具有的类型。
ChipCamp探索系列 -- 7A. 开源CPU之BOOM的来龙去脉 本文梳理一下Berkeley的乱序超标量CPU项目----Berkeley Out of Order Machine (BOOM),作为探索7系的首篇(7A)。 阅读详情

相关推荐

Zemax操作33--5倍激光扩束器

5倍扩束

lzy750750的博客 2932

java 数组能存放null,假如数组接收到一个null,那么应该怎么循环输出。百度结果,都需要提前判断。否则出现空指针异常。。我还是想在数组中实现保存和输出null。...

假如数组接收到一个null,那么应该怎么循环输出。因为foreach与obj.length都会报错。null不是对象,foreach中不能赋值?sp页面forEach一个存放对象的集合,怎么判断其中一个对象是否null?分享|2015-11-22 18:14lifeYesorno|浏览 87 次${designs }有三个null值,怎么在jsp页面中判断循环出来的某个是一个null值。2015...

weixin_33303595的博客 743

芯片级IO (Pad) Ring &IP Checklist

芯片级IO Ring,PAD Ring 和IP Checklist检查项目

weixin_37584728的博客 3572

java:Java中的函数和函数重载

Java中的函数和函数重载

2303_80025768的博客 1715

【CODESYS】-软件Bug与处理方法(20240710更)

【CODESYS】-软件Bug与处理方法(不定期更新)

qq_35316470的博客 5185

从Blender舞步到夜空画卷:基于Pix飞控的无人机编队灯光秀全链路开发实践

本文详细介绍了基于Pixhawk飞控的无人机编队灯光秀全链路开发实践。从Blender三维动画设计、QGroundControl地面站二次开发与MAVLink通信桥接,到PX4飞控的OFFBOARD模式路径控制与LED灯光驱动实现,最后通过Gazebo仿真验证并完成真机组装与首飞。文章为无人机爱好者提供了一套完整的、从创意设计到夜空执行的开源解决方案,重点阐述了多机同步与灯光控制的核心技术挑战与应对策略。

zeta9的博客 585

java函数及函数重载

java函数及函数重载

feilong1882的博客 2893

2D激光slam数据集的下载与测试

参考博客: https://blog.youkuaiyun.com/qq_24894159/article/details/81265991 https://blog.youkuaiyun.com/fk1174/article/details/52673413#commentBox 数据集下载与生成 下载数据集 下载网址: http://ais.informatik.uni-freiburg.de/slamevaluation/datasets.php 进去网站后点你想下载的对应的"download log file" 然后你

老李的博客 4025

java中的方法(函数)重载

上面是求的是两个整形数字的求和,那么我们要求两个double类型的的数字的求和呢 按照c语言的逻辑来写法就是这样↓ 如果要求三个整形数字相加呢?又要写成这样? 什么是方法重载? 在Java中,方法重载(Method Overloading)是指在同一个类中定义多个方法名相同,但参数列表(参数的个数、类型、顺序)不同的方法。 上述三个方法我们就能写成这样↓ 满足方法名一样,分别满足参数列表的类型不一样,个数不一样。 调用的时候就会有以上所有的情况,根据传参的

C语言 898

S32DS 3.5.8离线包怎么用?保姆级教程教你手动安装S32K3开发环境(附资源下载)

本文详细介绍了S32DS 3.5.8离线包的安装方法,适用于S32K3开发环境的手动搭建。从资源获取、完整性验证到分步安装指南,提供了全面的离线部署解决方案,特别适合军工/车企内网开发等场景。文章还包含版本选择建议、常见问题排查及团队协作方案,帮助开发者高效完成环境配置。

weixin_30471561的博客 477

UNet改进(54):当医学图像分割遇上频域学习与自监督

本文提出了一种改进U-Net的方法,通过频域增强模块和代理任务模块提升医学图像分割性能。频域增强模块在傅里叶空间对特征图进行可学习的频率调制,重点增强高频细节特征;代理任务模块通过图像重建约束编码器保留关键信息。两个模块协同工作,在仅增加5%参数量的情况下,形成空间域、频域和重建约束三条互补的信息路径。该方法特别适用于需要精细边缘分割的医学图像任务,预期能提升5%-10%的边缘分割精度,在小样本场景效果更显著。部署时可移除代理任务模块,不影响推理效率。未来可探索空间自适应频域调制和更丰富的代理任务设计。

2501_91516851的博客 226

java中函数的重载。

java中函数的重载。

jibhikk的博客 1728

微信小程序推广策略,打开小程序领域流量大门

本文旨在为小程序开发者、运营者和企业主提供一套完整的微信小程序推广策略体系,帮助他们在竞争激烈的小程序生态中获得更多流量和用户。内容涵盖从0到1的冷启动策略,到成熟期的增长技巧。本文将首先介绍小程序的基础推广设置,然后深入探讨各种流量获取渠道,接着分析数据驱动的优化方法,最后展望未来发展趋势。小程序:无需下载安装即可使用的应用,运行在微信生态内:独立访客数:页面浏览量转化率:完成目标行为的用户比例留存率:用户在一定时间后仍活跃的比例自然流量获取:通过优化搜索、完善资料等方式获得基础流量社交裂变。

小程序开发 1031

我出一道面试题,看看你能拿 3k 还是 30k!

我会出一道经典的后端面试题,你只需要进行 4 个简单的选择,就能判断出来你的水平是新手(3k)、初级(10k)、中级(15k)还是高级(30k)!

努力做最接地气的编程干货分享,感谢关注 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

一个弱菜的面试经历(美团网,cvte,腾讯)

从半年前开始找工作,一路被鄙视到现在。以至于面了一些公司也不敢发帖写面经了。         作为一个没有项目经验的渣渣,一开始问啥啥都不会。回忆一下,半年前找实习的时候,我第一次笔试和面试都给了cvte,当时因为选错方向就跪了。腾讯实习的时候也是选错方向,加上基础差,没经验也跪了。也不怕死的投了微软,做了一份全英的试题。还有uc的笔试之类的,最后都没过。然后我就决定暑假恶补基础,暑假回家之后由

u012138828的专栏 1121

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

面试训练瓶颈期困惑

我一直在做面试训练,练习回答各种问题,但是我发现我练习了很多问题还是仍然记不住如何回答,那么实际上我有提升吗?

Dontla的博客 275

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

经典面试题(21):以下代码将输出的结果是什么?

周末外出了两天,没有持续给大家带来新的题目,久等了!选错了!正确的答案是选项:C。调用在该作用域未声明的变量,是会报错的。而一个变量只声明,但未定义赋值的时候,才会是un...

qq_24520459的博客 246

七天面试之旅

  从上周一风尘仆仆的来到成都,到今天签下劳动合同。刚好一个星期。   总结一下我的面试,首先投简历,还是网投,但是刚刚开始只是投的Java实习生。 但是效果并不是很好,招Java的公司很多,不过只要Java实习生的公司并不是很多。   来成都的第二天就有一个面试,这个面试是我觉得最奇葩的,笔试还好,面试的时候是一个小伙子来问问题,问的全是技术,而且问的很细。又是第一次面试心里没底,...

weixin_34291004的博客 128

字节跳动后端校招备战指南:从笔试到面试的核心考点与心法

在互联网大厂校招中,后端岗位的竞争向来激烈,而决定成败的关键往往不只是掌握一门语言或框架,更在于对计算机基础的深刻理解。数据结构、操作系统、计算机网络、数据库原理等底层知识,构成了后端工程师的核心能力底座。无论是算法题中的时间复杂度分析,还是面试中的并发编程、分布式系统设计,这些技术价值的背后都指向同一个目标:用扎实的功底解决真实业务问题。本文以字节跳动2018校招后端方向第二批为切入点,系统梳理笔试准备、面试核心考点、项目复盘与备战节奏,结合Java技术栈、Redis、MySQL等高频考察内容,帮助求职者

weixin_30431445的博客 347

大模型 / RAG / Agent 面试高频题

大模型应用开发RAGAgentAI CodingLLM 工程化大模型微调算法 / NLP / 推荐等相关岗位(这里主要是介绍自己的项目,这里就不给出标准答案了)项目背景:为什么要做这个项目技术方案:用了 RAG、Agent、微调还是纯 prompt技术链路:数据怎么进来,模型怎么处理,结果怎么出去核心难点:不要说“工作量大”,要说技术难点指标结果:准确率、召回率、延迟、成本、人工节省等个人贡献:明确说“我负责什么”,不要只说“我们团队做了什么”

weixin_44151034的博客 971

HR拯救计划:免费又精准的AI得贤招聘官AI面试智能体,来了!

不用花钱,就能亲自体验头部企业同款AI招聘系统, 看看“精准打分、流畅面试、候选人满意”的招聘流程是怎样实现的。而在招聘这场没有硝烟的竞争中,谁能率先用上真正“精准高效”的AI面试官,谁就能赢得先机。联系AI得贤招聘官客服,立即领取10000次免费权限, 让招聘更科学,让人才选拔更高效。在“全行业内卷”的今天,企业不能再靠“人海战术”或“经验主义”应对挑战。从“凭感觉选人”到“凭数据选人”,AI得贤招聘官让招聘更科学、更客观。,真正做到“让AI像资深面试官一样懂人、选人、用人”。

2501_93602066的博客 472

酷家乐2020校招前端B卷深度拆解:闭包、React与手写题

前端面试中,JavaScript闭包与React Hooks是考察底层理解的高频考点。从闭包的作用域链原理到React生命周期与setState的批处理机制,这些概念不仅决定代码输出结果,更影响实际工程中的状态管理和性能优化。理解Map与Set的差异、HTTP缓存策略、算法中的滑动窗口与双指针,能够帮助开发者建立完整的前端知识体系。本文以酷家乐2020校招前端B卷为实例,深度拆解闭包输出题、组件通信、手写Promise.all等经典题目,梳理从基础语法到工程实践的避坑指南,为备战前端校招或跳槽面试提供系统的

weixin_30691649的博客 341

2016前端笔试题复盘:JavaScript核心考点与面试陷阱解析

前端面试中,JavaScript语言特性与浏览器运行机制始终是考察重点。理解作用域与闭包,能解释变量提升和循环绑定事件的常见陷阱;掌握this的调用规则,可准确预测函数执行上下文;熟悉事件循环与宏任务、微任务调度,是分析异步输出顺序的基础。这些底层原理不仅决定代码调试效率,也直接影响面试中手写题与代码输出题的得分。而在工程实践中,盒模型、BFC、事件委托等知识仍广泛用于布局优化和动态列表性能处理。本文从2016年阿里前端笔试题切入,系统梳理这些经久不衰的考点,帮助前端开发者构建扎实的知识模型,从容应对面试与

weixin_29016315的博客 241

Agent工具调用失败处理指南:从异常分类到容错兜底

在AI应用落地中,智能体与外部工具交互的稳定性成为关键。工具调用失败并非单一异常,而是涵盖模型选择错误、参数生成偏差、执行超时、结果解析失败等多类问题。理解全链路原理,建立分类处理与容错机制,是提升系统鲁棒性的核心。工程实践中,通过错误回喂、指数退避重试、幂等控制、熔断降级和人工兜底,可有效降低生产环境风险。本文系统梳理Agent工具调用失败的类型、模型侧与工程侧解决方案,并延伸至机器人控制等物理世界场景,为开发者提供可落地的应对框架。

weixin_29057695的博客 274

从牛客模考看大厂Java岗面试:核心考点与备考方法

Java面试中,HashMap底层原理、并发编程与JVM内存模型是最高频的基础考点,而“lambda函数 java”“java: outofmemoryerror: insufficient memory”等搜索热词,则反映出开发者对函数式编程细节和线上故障排查的普遍焦虑。理解集合排序、锁升级、线程池拒绝策略等技术原理,比单纯背诵八股文更能体现工程素养。这些知识在SpringBoot自动配置、API安全签名等真实业务场景中均有直接应用,也是大厂技术面试的核心考察方向。通过模拟大厂笔试与面试节奏的真题模考,可

weixin_34015336的博客 541
上一篇: 动手写第一个Windows程序
下一篇: 学计算机的你伤不起啊
diao21
博客等级 码龄16年 0粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值