§5.1.2和§5.6.2未提及数值提升和加宽如何适用于常数。
下面给出了预期的错误:
short a = 2;
short b = 3;
short s = a + b; // error: incompatible types: possible lossy conversion from int to short
但如果它们被宣布为最终版本,则编译时不会出错:
final short a = 2;
final short b = 3;
short s = a + b; // no error
为什么?规格的哪一部分解释了这一点?
我的猜测是它们是编译时间常量,因此被视为整数。
提升必须由编译器完成,因为没有添加短
s的JVM指令。
但是,编译器能够将所得到的整数和缩小为短值,因为:
如果表达式是byte、short、char或int类型的常量表达式(§15.28)。。。如果变量的类型是byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用窄化原语转换。
如JLS中所述。
添加final
确定它是否为常量表达式。
本文向大家介绍基于js的变量提升和函数提升(详解),包括了基于js的变量提升和函数提升(详解)的使用技巧和注意事项,需要的朋友参考一下 一、变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的部分。 上个简历的例子如: 之所以会是以上的打印结果,是由于js的变量提升,实际上上面的
行字节标记为错误。我理解表达式的结果是一个整数,但不像文字那样“降级”。即使只有一个变量,比如,结果也不会降级。到底为什么?我相信这与变量类型有关,但在默认情况下,文字是整数,它们可以被“降级”。 我正在努力解决的另一个例子是:我们可以为byte、short或char类型的变量分配整数文本,Java将自动将整数转换为我们声明的变量类型,例如: 另一方面,我们为什么不能这样做呢? 如果你能搜索一些我
本文向大家介绍详解javascript中的变量提升和函数提升,包括了详解javascript中的变量提升和函数提升的使用技巧和注意事项,需要的朋友参考一下 1在js中只有两种作用域 a:全局作用域 b:函数作用域 在ES6之前,js是没有块级作用域。 首先来解释一下什么是没有块级作用域? 所以此时 是可以打印输出变量a的值。 2:什么是变量提升? 在我们的js中,代码的执行时分两步走的,1、解析
我正在将tomcat服务器从tomcat7升级到Tomcat8。但Struts1.1似乎不能在Tomcat8上工作。有人知道Tomcat8不支持Struts1.1吗。 下面是堆栈跟踪
问题内容: 我想在android上现有的sqlite数据库上执行以下操作,该数据库的构建方式类似于该列:id — rule — path —someotherdata 现在,规则例如包含文件名的一部分(或者只是一些琐碎的东西,例如“ mypicture”,也可能是文件类型,例如“ jpg”)。现在我想做的是,我想编写一个查询,该查询将获取我的所有规则,其中包含输入字符串的一部分。我尝试了以下示例:
当使用文字创建字符串时,它会存储在池中。但当使用new运算符创建字符串对象时,它会将对象存储在堆中。 但是,堆中的对象只是一个指向存储在池中的文本的指针,还是一个存储在堆中的简单字符串对象,符合GC的条件?