java short 赋值_一道Java面试题的101℃思考

在java学员去公司面试的时候,经常会遇到下面这样类似的一些面试题:

short s1 = 1; s1 = s1+1;能正常运行吗? short s1 = 1; s1 += 1;呢?

byte s1 = 1; s1 = s1+1;有错吗? byte s1 = 1; s1 += 1;有错吗?

int s1 = 1; s1 = s1+1;能正常运行吗? int s1 = 1; s1 += 1;呢?

long s1 = 1; s1 = s1+1;能正常运行吗? long s1 = 1; s1 += 1;呢?

类似的还有:

int和Integer有什么区别?

String、StringBuffer和StringBuilder有什么区别?

……

d442aa748ffcca2efbb87fed23f1d84d.png

Java攻城狮面试

基础一般的大多数学员都不能正确的回答或只能说个大概,有的甚至“丈二和尚摸不着头脑”,基本上都会丢分,甚至“全军覆没,损失惨重”,自然错失了好的面试机会。那该如何在日常的面试准备中充分准备,做到胸有成竹、一蹴而就呢?

d3daf2af6fdc2abe5ae22793c194133d.png

充分准备而面试失败的表情

我这里建议大家从如下几个方面入手,充分准备自己的面试考试,打有准备的仗。我们不应该仅仅停留在这道面试题上,而应该静下心来认真思考:平时该如何学习才能应对后续的各种面试官的提问。当然,我们要十分清楚,面试只是开始,真正的重中之重是打牢基础,能更出色地完成以后的各项工作任务。这才是我们要深度思考的。

第一、做个“量身定做”的复习计划。

毛主席在《解放战争第二年的战略方针》中指出“不打无准备之仗,不打无把握之仗”。因此,要制定一个适合的、高新的复习计划,必须注意如下要点:

1、必须清楚自己的知识掌握程度。

自己应该最了解自己,哪些知识已经掌握了、理解了,哪些知识还没掌握,哪些知识还是空白。自己要做到心里有素。如果对自己的知识体系结构还不是了如指掌,那你在做计划前,还必须做一个重要的功课,那就是对自己的知识技能做一个全面的“普查”。

如何“普查”呢?可以找几套知名科技企业的面试题,或自己向往已久公司的面试题,或者看着自己培训教材(或参考书)的目录回忆各个知识点,那些想不起的、能想起了但比较模糊的、需要提示才能想起的,就是自己的“遗漏的知识点”,即薄弱环节。这“死穴”就是制定复习计划的重点,需要多分配时间去弥补。

“普查”中还需要找出自己存在的难点。比如,在日常的教学中,“数组、循环、方法、面向对象、线程、框架”等,就是比较常见的难点,理解困难、理解了又难于运用这些知识点解决实际问题。这些在找出来以后,也需要在制定复习计划中,专门分配一块时间,做有针对性的强化训练,此时不会的,一定要请教同学或老师,把“问题扼杀在摇篮”中。

2、了解面试公司,尽可能知道其具体的技能要求。

不足或尚不熟练的技能,需要在制定复习计划时引起足够的重视,分配更多的时间和资源,以便面试前达到熟练掌握的程度,从而增强自己的竞争综合能力,提振自己面试的自信心。

3、合理分配时间、有效管理时间。

抓住重点和难点,多分配时间资源,不重要的可少分配时间。时间紧迫时,次要的内容可以快速看下,或直接忽略掉。

4、检查每个时间节点是否认真完成,是否达到预期的复习效果。如没都达到,要弥补或局部调整复习计划,以便更好的完成面试前的复习准备。

5、制定复习计划,切记猜题、押题。应该全面而突出重点、难点。

第二、采用好的学习方法,比如3W1H法。

学习如何一项知识或技能,都需要有一些对自己来说是行之有效的方法。这样可以达到“事半功倍”的效果,否则就会“事倍功半”。比如教学中经常用到的3W1H,其实也可以用到学习中,以提高学习效果。

cc09bcf60edf68006f4732e7b16524bc.png

3W1H学习法

What

学习一个知识时,首先要明确这个知识是什么,即What。避免学完一个阶段了,一问三不知或张冠李戴。

Why

对所学的知识点要清除为什么要学习,即Why。也就是说这个知识有什么作用,在实际的生活中,到底能帮我们解决什么问题。想明白了,学习时才会更加认真,理解才能深刻、彻底。

Where

明确所学知识点在哪里可以用到,即Where。学了半天,不清除所学知识的适用场景,到头来和没学一样。更不能做到“有的放矢”、“百分百中”。

How

明确如何使用所学知识,即How。这是学习知识最关键的一步,搞清除如何使用所学的知识来解决实际问题,能否“学以致用”是衡量我们是否掌握该知识点的唯一标准。

经过这四个关键词的学习、思考和梳理,通常对该知识点能较好的掌握和运用。在学习复杂知识时,最好坚持做好这四个环节,才能加深理解;对于十分简单的知识,我们也可以灵活处理,去掉其中的一些环节,节约宝贵的时间。

第三、“理论联系实际”,多上机操作、调试程序,理解代码的本质和运行机制,最终才能“学以致用”。

宋代大诗人陆游在《冬夜读书示子聿》中就深刻地告诫我们:“古人学问无遗力,少壮功夫老始成。纸上得来终觉浅,觉知此事要躬行。”赵括“纸上谈兵”的故事也都说明不能忽视实践的重要性。马克思指出“实践是检验真理的唯一标准”。java编程更是如此。所以在学习完理论知识后,更多的要花时间去Java编程环境中实践,在实践中学习。

下面我们分四种情况,抽丝剥茧,逐一进行分析,看其中藏有什么玄机:

1、short s1 = 1; s1 = s1+1;能正常运行吗? short s1 = 1; s1 += 1;呢?

ff7446e3d254bd59fdb4c017f191c022.png

从上图可以看出,Java编译器已经给出“s1 = s1+1;”代码的错误提示“Type mismatch: cannot convert from int to short”,即“数据类型错误:不能从int数据类型转换到short数据类型”。

类型不匹配说明问题的根源在哪里?回到出错的关键代码“s1 = s1+1; ”,我们发现:

ad991d54c530a3864aab59a4b02063d8.png

从上图中可以看出,第②行代码中赋值号“=”左右两边的数据类型不匹配。右边“s1+1”执行时会把s1的数据类型提升为int,然后和“1”进行加运算,再将int类型的结果赋值给short类型的s1,此时因为short数据类型的范围比int数据类型小,且Java中要把范围大的数据类型(比如int 、long等)的值赋值给范围小的数据类型(比如byte、short等),必须进行强制转换(反之可以),否则将导致错误

再看上图中的第13行代码“s1 += 1;”却没有任何错误。这又是为什么(分析Why)?

Java语言规范中把(x = x + i)表达式称为简单赋值操作符(=),而(x += i)表达式则是复合赋值操作符。

复合赋值(E1 op = E2)等价于简单赋值((T)E1=(T)((E1) op (E2)))。复合赋值表达式自动将“=”右边的计算结果转型为其左侧变量的类型。这里分两种情况:

1.1、如计算结果((E1) op (E2))的数据类型与该变量(E1)的数据类型(T)相同,则这个转型不会报错,且不会造成数据丢失。参看后续第3种情况。

1.2、如计算结果((E1) op (E2))的数据类型比该变量(E1)的数据类型(T)的范围小,则这个转型不会报错,且不会造成数据丢失。参看后续第4种情况。

1.3、如计算结果((E1) op (E2))的数据类型比该变量(E1)的数据类型(T)的范围大,那么复合赋值操作符将把右边的计算结果((E1) op (E2)) 强制转换为左边变量的数据类型(T)。这个转型不会报错,但可能造成数据丢失。参看后续第2种情况。

复合赋值表达式可能是危险的,请不要将复合赋值操作符用于byte、short或char类型的变量。

由此可见,Java中(x = x + i)和(x += i)是有很大区别的,这也是面试官经常挖坑的地方。平时学习应该多留意,深入分析其本质。

2、byte s1 = 1; s1 = s1+1;有错吗? byte s1 = 1; s1 += 1;有错吗?

同样道理,这种情况也会报错“Type mismatch: cannot convert from int to byte”。这里不再赘述。

49137335b97546724ce859e07ebd2dee.png

3、int s1 = 1; s1 = s1+1;能正常运行吗? int s1 = 1; s1 += 1;呢?

96e7f22a5a2dcfc61354fb93afa7e8aa.png

4、long s1 = 1; s1 = s1+1;能正常运行吗? long s1 = 1; s1 += 1;呢?

1c07a5f6565c118f509344ce63262d79.png

第四、充满好奇心,善于对比学习,找出其中的异同,发现本质的区别。

基础知识学习的过程中,善于使用“对比”等学习法,比较相似的知识的异同,通过查阅、看源代码、讨论扥,研究其代码本质是否相同,会不会导致运行的结果不同。

第五、善用面试题

多做面试题,尤其是有名的大公司的面试题极具代表性,透过面试题可以准确知道自己知识的掌握程度,有哪些新技术将成为未来的主流方向(以便多学习,提升自己就业的核心竞争力),还存在哪些不足,应该如何弥补这些不足。当然不能一味的为了面试而面试,面试只是走向职场的第一步,而更重要的仍然是提高我们综合解决问题的能力。不能简单的记住答案就万事大吉了,浅尝辄止,始终是知其然而不知其所以然,不能只知其表不知其里。

最后,总结一下。Java的日常学习和面试的准备,好比一场战役的战前准备。功夫在平时。“作战”前了解面试公司的基本情况和要求后,要做全面、充分的准备,确定面试的复习目标,制定详细可行的计划,合理分配时间和资源,按照计划执行认真。再辅以恰当的学习方法(如3W1H、对比学习等),多看、多练、多实践、多总结,勤学巧干,注重解决问题能力的培养,“动手能力是第一生产力”。这样才可能取得面试的胜利。

祝君好运!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值