Java 常见的 30 个误区与细节!

640?wx_fmt=gif


1   在Java中,没有goto语句。

因为大量使用goto语句会降低程序的可读性和可维护性,所以Java语言取消了goto的使用。

同时,为了避免程序员自行使用goto所带来的混乱,Java语言仍将goto定义为一个关键字,但是没有定义任何语法,故称为“保留字”。

2   truefalsenull在IDE中虽然以不同的颜色显示,但是并不是关键字,而是“字面常量”,就和String类型的abc一样。

3   定义名称时尽量避免使用$,因为编译器在对.java文件进行编译的时候,会将”$”编译成顶层类型与底层类型的连接符。

见下例:

640?wx_fmt=png


在编译(javac Test3.java)这段代码的时候,编译器会报以下错误:

Test.java:12: 错误: 类重复:

com.javastack.Test.Outer.Inner class Inner{ ^

4   Unicode转义字符处理的非常早,在解析程序之前。

例如:

640?wx_fmt=png


在程序中出现这两行代码编译报错,这两个Unicode码分别表示”换行”和”回车”。

所以,在编译器编译的时候,代码是这样的:

640?wx_fmt=png


5   Unicode码使用16位字符编码,在Java中用char类型来表示。

现在Unicode已经扩展到一百万个字符,超出16位限制的成为增补字符。

所有增补字符都不能用字符常量来表示。

6   当shortbytechar参加运算时,结果为int型,而非与较高的类型相同。

如果变量是byteshortbyte类型,当对其赋予编译时期的常量,而该常量又没有超过变量的取值范围时,编译器就可以进行隐式的收缩转换。

这种隐式的收缩转换是安全的,因为该收缩转换只适用于变量的赋值,而不适用于方法调用语句,即不适用于方法调用时的参数传递。

(详见java中默认类型转换的小问题)

7   注意char类型,这是一个无符号类型。

因此,charshortcharbyte之间的转换必须显示地使用类型转换。 

bytechar的转换为扩展收缩转换,该转换比较特殊,即先将byte扩展转换到int,然后再收缩到char

8   在整型数据间的扩展转换中,如果操作数是char类型(无符号类型),则进行无符号扩展,扩展位为0。

如果操作数是byteshortint(有符号类型),则进行有符号扩展,扩展位为该变量的符号位。

9   整型数据之间的收缩转换,仅仅是截断并丢弃高位,不做任何其他处理。

10   0.1+0.2不等于0.3.System.out.println((double)0.1+(double)0.2);这条语句的输出结果是0.30000000000000004

因为计算机使用二进制来存储数据,而很多小数都不能够准确地使用二进制来表示(事实上,大多数地小数都是近似的),就像使用十进制小数不能准确地表示1/3这样地分数一样。

大多数地浮点型,在计算机中只是近似地存储其值,而不像整型那样准确地存储。

又例,这是一个死循环:for(float f = 10.1f;f != 11;f+=0.1f){}

11 float类型可以保留7~8个有效数字,而double类型可以保留15~16个有效数字,因而当int类型或long类型数值多于double或float地有效数字时,该值的一些最低有效位就会丢失,从而造成精度丢失。

这时,就会采用IEEE754最近舍入模式,提取与该整型值最接近的浮点值。

尽管整型向浮点型的转换属于扩展转换,但当数值很大或很小(绝对值很大)时,就会产生一定的精度丢失。

12  i+++j如何计算?

(这个问题在C/C++)中讨论是没有多大意义的,因为C/C++依赖于实现的硬件结构,不同的环境结果也会不同。

不过在Java中,这个结果是固定的,不受其运行的硬件环境与平台的影响) 

答:根据贪心规则,前置++优于后置++,结果是(i++)+j

13  i++和++i其实都是先+1,再赋值。

++i,没什么好说的;i++,以j=i++;为例在底层的实现是:temp = i;i = i + 1; j = temp。

所以,i=15;i=i++;这个表达式的结果是15。

(因为加一之后又执行了一次赋值,从16变回15)

14   +0与-0在浮点类型变量存储中,符号位是不同的。

当-0和+0参与浮点类型的相关运算(例如相除与求余运算)时,可以产生不同的结果。

15   浮点的相除与求余运算不同与整型的相除与求余运算,当除数为0时,浮点运算不会产生ArithmeticException异常。

16   String类是非可变类,其对象一旦创建,就不可销毁。

String类那些看似修改字符序列的方法实际上都是返回新创建的String对象,而不是修改自身对象。

17   由于String对象是不可改变的,因此具有线程安全性,可以自由地实现共享。

18   在String类内部,是使用一个字符数组(char[])来维护字符序列的。

String的最大长度也就是字符数组的最大长度,理论上最大长度为int类型的最大值,即2147483647.在实际中,一般可获取的最大值小于理论最大值。

19  main()方法在表现行为上,与其他方法基本相同,可以重载,由其他方法调用,继承,隐藏,也可以抛出异常,带有类型参数。

我们也可以在一个程序中通过反射来调用main方法(或其他方法)。

20 当两个或多个方法的名称相同,而参数列表不同时,这几个方法就构成了重载。

重载方法可以根据参数列表对应的类型与参数的个数来区分。

但是,参数的名称、方法的返回类型,方法的异常列表与类型参数不能作为区分重载方法的条件。

21   究竟选择哪个方法调用,顺序是这样的:

  • 在第一阶段,自动装箱(拆箱)与可变参数不予考虑,搜索对应形参类型可以匹配实参类型并且形参个数与实参个数相同的方法;

  • 如果在步骤一不存在符合条件的方法,在第二阶段,自动装箱与拆箱将会执行。

  • 如果在步骤二中不存在符合条件的方法,在第三阶段,可变参数的方法将会考虑。

  • 如果3个阶段都没有搜索到符合条件的方法,将会产生编译错误。

    如果如何条件的方法多于一个,将会选择最明确的方法。

    最明确的方法定义为:如果A方法的形参列表类型对应的都可以赋值给B方法的形参列表类型,则A方法比B方法明确。

    如果无法选出最明确的方法,则会产生编译错误。


22   重写和隐藏的本质区别是:重写是动态绑定的,根据运行时引用所指向对象的实际类型来决定调用相关类的成员。

而隐藏是静态绑定的,根据编译时引用的静态类型来决定调用的相关成员。

换句话说,如果子类重写了父类的方法,当父类的引用指向子类对象时,通过父类的引用调用的是子类方法。

如果子类隐藏了父类的方法(成员变量),通过父类的引用调用的仍是父类的方法(成员变量)。

23   构造器是递归调用的,子类的构造器会调用父类的构造器,直到调用Object类的构造器为止。

24   构造器没有创建对象,构造器是使用new创建对象时由系统调用的,用来初始化类的实例成员。

从顺序上说,先是创建对象,然后再调用构造器的。(构造器并没有产生新的对象)

25   默认的构造器不为空,该构造器会调用父类的无参构造器,并可能执行实例成员变量的初始化。

所以,默认的构造器至少调用了父类的构造器,它做的工作还可能更多,包括实例变量声明初始化与实例初始化块,都是在构造器中执行的。

26   当==或!=运算符的两个操作数的类型一个是基本数据类型,另一个是包装类引用类型时,将引用类型拆箱转换为基本数据类型,然后比较两个基本数据类型的值是否相等。

27   在Java中,数组也是类,数组声明的引用变量指向数组类型的对象。

所有的数组都继承Object类,并且实现了java.lang.Cloneablejava.io.Serializable接口。

数组的成员包括变量length(隐式存在)与从Object类继承的成员。

CloneableSerializable是两个标记的接口,这两个接口中没有显式声明任何成员。

28   接口是完全抽象的设计,不能实例化。

使A用new方式创建的借口类型,实际上是创建了一个匿名类,该匿名类实现了接口类型。

29   如果两个接口声明了相同的变量x,则当某接口同时继承这两个接口,或者某类同时实现这两个接口时,通过简单名称访问会产生编译错误。

30   如果两个接口中声明了相同名称的方法m,并且两个方法没有构成重载,则当某接口能够同时继承这两个接口,或者某类能够同时继承这两个接口时,必须存在一种方法签名,使得该签名同时为两个m方法签名的子签名,并且在方法的返回类型上,必须存在一种类型,使得该类型同时为两个m方法返回类型的可替换类型。


来源:

http://www.kawabangga.com/posts/568

版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。


数据与算法之美

用数据解决不可能


640?wx_fmt=jpeg

长按扫码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息技术上册教案了解计算机,信息技术上册全册教案

信息技术上册全册教案[课时]:1节课[教学内容]:认识媒体;认识多媒体[教学目标]:1、了解媒体的概念和分类,理解多媒体的内涵和特征。2、能从日常的生活和学习中感受各种媒体及其作用3、培养学生对媒体、多媒体的喜爱,引发他们继续学习的热情。[教学重、难点…

轻量级NuGet—BaGet

1. 介绍BaGet是一个轻量级的包管理服务。有些时候公司或者个人不希望某一些包进行公开,那么就需要使用私有的包管理服务程序,该服务是用.netcore进行编写的(感谢开发者为.NET社区做出的贡献)Github:https://github.com/loic-sharma/BaGet官网…

为什么这个SQL Server DBA学习PowerShell--SQL任务

我开始学习PowerShell,是因为我在寻找一种快速和高效的方式收集有关我的SQL Servers的信息和更好地管理我的服务器工作负载的方式。我以为,我正在学习是另一门新的脚本语言,它能帮我做到前面提到的设想。实际上,我发现学习 PowerS…

30张地图看懂世界格局,用大数据说话

摘要:世界那么大,要了解的数据那么复杂,下面知识探索小编帮您总结一下关于世界的数据。1、 世界人口聚居地红色越深人口密度越大;灰色代表无人地带。2、全球各国平均智商分布图颜色越浅智商越高3、全球冰川融化后的世界地图4、全世…

.NET Core3.1 Dotnetty实战教程

Dotnetty实战系列视频由于在.net的环境当中对dotnetty相关资料相对较少,所以这里主要分享一个dotnetty使用教程希望能帮助到正在使用这套框架的开发者们。虽然这套框架已微软官方已经不在维护,但是这套框架里的设计是相当不错的通过阅读源码能学习到很多…

计算机u打字,win7电脑打字打不出来怎么办

在windows电脑当中,必不可少的一个操作就是打字了,输入代码需要打字,网页中搜索也需要打字,网络聊天也需要打字,不过最近有位win7系统用户,在电脑中打开浏览器,输入想要找的资料的时候&#xff…

我用Python爬取了14年所有的福彩3D信息,彩民们,只能帮你们到这了

作者|丁彦军来源|恋习Python前两天,在网上看到一个有意思的问题:彩票预测靠谱么?为什么还有那么多的人相信彩票预测?暂且不说,彩票预测是否靠谱?彩票预测也分人而异,江湖上骗术很多,…

C#: 8.0 和 9.0 常用新特性

在《带你了解C#每个版本新特性》 一文中介绍了,C# 1.0 到 7.0 的不同特性,本文接着介绍在 8.0 和 9.0 中的一些常用新特性。C# 8.0在 dotNET Core 3.1 及以上版本中就可以使用 C# 8 的语法,下面是 C# 8 中我认为比较常用的一些新功能。默认接…

选股公式 成功率测试 软件,通达信股票软件选股公式,99%的成功率,你还等什么?...

工具:通达信金融终端使用方法:1、通达信软件界面2、点击“功能”“公式系统”“公式管理器”“条件选股公式”“其他类型”,点击新建3、使用选股公式,点击ctrlt,弹出条件选股窗口4、选中公式,点击加入条件&…

小米 华为都要造车?.NET高薪潮来了!(附招聘链接)

近期网络沸沸扬扬的小米、华为、苹果 都要造车,其实百度、阿里和腾讯 也都入局了。互联网大佬们纷纷开始造车,跟我们小小程序员有关系吗?有!高薪机会来了,尤其是WPF!且听下文分解。物联网终极形态“互联网”…

聚类算法学习指南(二)

http://hi.baidu.com/catfool/blog/item/c06bec3931a0efcad4622524.html 聚类算法学习指南(二)2009-05-06 20:49下图图 3-1 聚类方法的分类示意图3.1 传统聚类算法3.1.1 层次方法层次法对给定的数据对象集合进行层次似的分解。按层次分解的形成方式&…

.NetCore跨域

描述浏览器安全策略上的安全限制可以有效阻止Ajax向另外的一个域server发起请求,这就是著名的同源策略,如何突破这种限制,可以使用CORS。public static void AddCommon(this IServiceCollection services){services.AddCors(options >{opt…

山东大学计算机非全上课,山东大学非全日制研究生上课方式

【导读】山东大学非全日制研究生上课方式。如今非全日制研究生考试已经与全日制一样,连考试内容和时间也都是一样。许多想要报考山东大学非全日制研究生的人员开始担心,非全日制研究生和全日制研究生的考试样了,那么上课方式会不会也是一样的…

【转载】可复用的FS

有很多朋友要求给出一个应用ESFramework的Demo,在前面介绍ESFramework支持的4层架构中(回顾),有AS、FS、IRAS,其中FS的功能需求最简单,所以本文就给出一个FS实现示例。 FS主要用于管理功能插件&…

Git、GitHub、GitLab三者之间的联系以及区别

在讲区别以及联系之前先简要的介绍一下,这三者都是什么(本篇文章适合刚入门的新手,大佬请出门左转)1.什么是 Git?Git 是一个版本控制系统。版本控制是一种用于记录一个或多个文件内容变化,方便我们查阅特定版本修订情况的系统。以前在没有使…

zen服务器芯片,服务器版Zen处理器简直大杀器:32核64线程,8通道DDR4内存

拼 命 加 载 中 ...在这次的E3展会上,AMD除了公布RX 470/460显卡之外,还跟雷蛇发了一款支持VR的背包PC,使用了RX480显卡,处理器则是AMD的Zen,8核16线程,这还只是桌面版的,要知道Zen处理器最重要…

【赠书活动】优雅免费领书指南

快扶朕起来,我还要送书!在上一期的赠书活动上结束后。超模君就吩咐小树包装好书籍,寄给获奖的模友们!很多模友收到书籍都表示很不错,期望能再来一次赠书活动。这不,朕又想,超模君又想送书了&…

利用11行Python代码,盗取了室友的U盘,内容十分刺激!

作者:Python新世界 來源:简书https://www.jianshu.com/p/3d7b2d9fe679序言那个猥琐的家伙整天把个U盘藏着当宝,都睡觉了就拿出来插到电脑上。我决定想个办法看他U盘里都藏了什么,直接去抢U盘是不可能的,骗也是…

鸡肋还是革新——Blazor进WinForm

winform是一老技术,感觉都有点掉牙了(我近20年前就是从winform开始接触.net的);blazor,是微软技术圈里的新宠,正在被悉心照顾。当这一老一少的技术碰撞后,会有什么火花?.net v6.0.0-…

一个女程序员征男友的需求说明书

前 言常听人说程序员的生活枯燥为人刻板,其实这是你不懂程序员。代码之外,生活之中,这些高智商人的幽默风趣,才华的展现往往能在「论坛」这个神奇的领域一窥究竟。(悲哀,因为给他们展现Coder之外才华的地方…