🏠 个人主页:csdn春和
🛰 推荐专栏:更多专栏尽在主页!
JavaWeb专栏(从入门到实战超详细!!!)
SSM专栏 (更新中)
📖 本期文章:问题思考
如果对您有帮助还请三连支持,定会一 一回访!
❓ 直接看问题
问题思考:下面的代码在java中能否正确运行?在Scala中呢?
val c : Char = 'A' + 1 println(c)
首先我们看看在java中是否正确
再看看在Scala中IDEA是否会报错:
分析:+为二元运算符 当数据类型不匹配时会自动提升数据类型 但是结果为int 将int值赋给char型 所以会报错
真的是这样吗?
我们再来看看运行结果:
我们发现java 和 scala都能正常运行,这是为什么?
其实上述代码在java和scala中都是正确的,这个跟编译器有关系,常量计算是在编译时完成的!
在Java中我们注释掉上述代码 ,添加下面的代码:
再次运行 反编译查看:
进行反编译
查看反编译结果:
所以刚刚的代码就好理解了,其运算在编译时就完成了 执行时并不会报错。
我们再次将代码打开 运行
反编译查看
由于A对应的是65 65+1=66 并且由于是在编译时就计算得到66 而66 也没有超出char的范围(-128~127)那么真正执行到
char c = 'A' + 1
的时候 就相当于char c = 66
而66 对应的字符是B 所以最后会输出 B
在scala中也是正确的,Scala是有java进化而来,运行机制也和java一样 在编译时得到结果,真正执行的时候还是在char的范围内 在Scala中最后运行结果也会输出B
上述能正常运行的原因在于两个都是常量如果是如下代码呢?
在java中直接编译就不通过
在Scala中运行也不行
所以变量不可以,只有常量计算才是在编译时完成!所以这个代码在java和Scala中都能正确运行不会报错!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)