Java关于使用“final”修饰基本类型的注意事项
今天无意发现这样一道题,可以先做做看:

正确答案是BCD。
至于原因有人给出了参考答案:
2、如果有一个操作数是long型,计算结果是long型;
3、如果有一个操作数是float型,计算结果是float型;
4、如果有一个操作数是double型,计算结果是double型;
public class Test1
{
public static void main(String[] args) { final byte a1=1,b1=1,b11;
final char a2='a',b2='a',b22;
final short a3=3,b3=3,b33;
final int a4=4,b4=4,b44;
final long a5=5,b5=5,b55;
final float a6=6,b6=6,b66;
final double a7=7,b7=7,b77; //等号右边,被final修饰的为byte,short,char,int中的任何一种;等号左边可以为byte、short、char、int、long、float、double中的任何一种都不会出错
b11=a1+a2;
b11=a2+a3;
b22=a3+a3;
b33=a4+a3;
b44=a2+a3;
b55=a1+a3;
b66=a2+a3;
b77=a4+a3; //等号右边,被final修饰的为long、float、double中的任何一种;等号左边类型必须等于或者高于等号右边类型才不会出错,否则出错。
b11=a4+a5; //编译时出错 类型不匹配:不能从 long 转换为 byte
b22=a5+a5; //编译时出错 类型不匹配:不能从 long 转换为 char
b33=a5+a5; //编译时出错 类型不匹配:不能从 long 转换为 short
b44=a5+a5; //编译时出错 类型不匹配:不能从 long 转换为 int
b55=a6+a6; //编译时出错 类型不匹配:不能从 float 转换为 long
b66=a5+a6;
b77=a7+a2;
}
}
以上结论正确?正确了一半,这只是在找规律并不能解释所有情况,例如:
final byte a = 126;
final int b = 2; byte x = a+b; // 编译出错 不能从 int 转换为 byte
为什么错误?
因为,final修饰的变量其实为常量,即在编译期间的时候就已经确定为一个具体的不变的东西,所以以上代码在运行的时候直接相当于 byte x = 126 + 2;【byte 范围为-128~127】
而byte x = 122 + 5;就不会有错。
但是要注意的是,long、float、double替换成相应常量时候会自动带上标识L、F、D,所以我们平时带入这三种时记得带上标识。例如12L、12.0F、12.0D。
int y = 12D + 12L; // 编译出错 不能从 double 转换为 int
额外的,我们需要提醒一些情况【与final无关】
int x = 2147483647 + 2147483647; // 正确 【2147483647为int最大值】
int y = 2147483648; // 类型 int 的文字 2147483648 超出了范围
第一行代码,右边计算溢出,但是由于底层默认采用int补码进行运算,最后得到的补码再还原,值为-2再赋值给左边,所以不会报错,而第二行直接就溢出了。
【如需计算,则将右边其中一个2147483647加上L(变为long),并且将x声明为long即可使用long的补码计算】
综上所述,其实有关【使用“final”修饰基本类型】并不需要分太多情况,
直接将final那个变量名用其常量值进行带入,再判断是否发生各种错误即可。
这时候,我们再回到最开始的那道题就很好解了:
- b3=(b1+b2); /*语句1*/ ——> b3 = b1+ b2; // 错,右边整形计算默认使用int,最终为int 而左边为byte类型,大变小需要强转
- b6=b4+b5; /*语句2*/ ——> b6 = 4+ 6; //正确
- b8=(b1+b4); /*语句3*/ ——> b8 = b1+ 4; // 错,同1
- b7=(b2+b5); /*语句4*/ ——> b7 = b2+ 6; // 错,同1
最后附上等号右边变量计算最终类型表:(直接写则整形为int,小数为double)
全为整形:无long——int 例如(byte)a +(short)b + 1
有long———long 例如(byte)a +(short)b + 1 + (long)d
包含小数:无double——float 例如(byte)a +(short)b + 1 + (long)d + (float)e
有doule——double 例如(byte)a +(short)b + 1 + (long)d + (float)e + 1.0
Java关于使用“final”修饰基本类型的注意事项的更多相关文章
- java中的final与可变类型、不可变类型的关系
如果你对final和不可变类型的概念与区别有疑问的话,可以打开这篇文章.希望我的解答可以帮到您! 1.不可变类型: 什么是可变类型,什么是不可变类型呢? 首先我们看一下下面的这行代码: String ...
- Java中的final修饰符
1.什么时候可以选择final修饰符 如果想让一个类不被其他类继承,不允许在有子类,这时候就要考虑用到final来修饰. 2.用final修饰的类 首先大家要明白,用final修饰的类是不能被继承的, ...
- Java基础-被final修饰的引用变量的指向
final修饰的引用变量一旦初始化赋值之后就不能再指向其他的对象,那么该引用变量指向的对象的内容可变吗?看下面这个例子: public class Test { public static void ...
- java基础 关于final修饰符
final作为一个修饰符,可以修饰类.变量.函数. 1.被final修饰的类不可以被继承(保护封装性),为了避免被继承,被子类复写: 2.被final修饰的函数不可以被复写 3.被final修饰的变量 ...
- 对于final修饰的类型运算时的表现
我们知道,对于byte,char,这些数据类型加减时都会转化成int在运算,然而,对于final修饰过的数据是不会发生转换的. 比如说 byte b1=1; byte b2=2; byte b3=b1 ...
- Java学习:final关键字的使用与注意事项
final 关键字代表最终.不可改变的. 常见的四种用法 可以用来修饰一个类 可以用来修饰一个方法 可以用来修饰一个局部变量 可以用来修饰一个成员变量 1.当final关键字用来修饰一个类的时候,格式 ...
- Java学习——使用final修饰符
package Pack1; import java.awt.*; import java.applet.*; class ca { static int n = 20; final int nn; ...
- Java final修饰形参
转自:http://java.chinaitlab.com/base/836044.html public class BB{ public int i; } public class PP{ pub ...
- 【JAVA】final修饰Field
一.简介 final修饰符可以用来修饰变量.方法.类.final修饰变量时一旦被赋值就不可以改变. 二.final成员变量 成员变量是随类初始化或对象初始化而初始化的.当类初始化的时候,会给类变量分配 ...
随机推荐
- Jquery对话框基本配置
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } p.p2 { margin: 0.0px ...
- java基础数据类型包装类
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- 救援模式(Rescue Mode)、单用户模式(Single-User Mode)、紧急模式(Emergency Mode)的区别与联系
前天聚餐的时候一航和启飞学长讲到RUCTF中更改root密码要进入单用户模式,我插了一句"有的系统显示的是救援模式",说完后心里一直很虚...(技术上的事还是想好再说)今天查了一下 ...
- Web服务器、应用服务器、Web容器、反向代理服务器区别与联系
作者: 帅虫哥 出处:www.cnblogs.com/vipyoumay/p/7455431.html(点击尾部阅读原文前往) 我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web ...
- 小白的Python之路 day2 列表、元组操作
1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 1 names = ['Tom','Jack','Qian'] 通过下标访问列表中 ...
- JAVA 解析、编辑nginx.conf
最近工程开发遇到一个需求:用Java去解析并编辑nginx.conf 在github上找到nginx-java-parser工具,项目地址:https://github.com/odiszapc/ng ...
- 最全linux命令
arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI ...
- ArcGIS API for JavaScript 4.3 与ArcGIS Server联动使用【地图服务】
[前言] 有好些网友问我怎么使用Server发布的地图服务了,其实非常的简单. 我在这里先声明:不提供Server软件,需要的请自行使用互联网搜索资源: 不阐述Server如何发布各各种服务,但是我会 ...
- Nodejs的运行原理-架构篇
前言 本来是想只做一个Nodejs运行原理-科普篇,但是收到了不少私信,要我多分享一些更进阶,更详细的内容,所以我会在接下来的两个月里继续更新Nodejs运行原理. PS:此系列只做Nodejs的运行 ...
- bug运输[辽宁2014年省队互测一]
奇奇怪怪的题目,不知道他要我们干什么. 我们观察一波局势,发现答案最大不过5.因为如果答案是6或以上的话,我们就至少要2^(5*5)个5*5的方格. 仔细计算一波时间复杂度,再信仰一波,坚信暴力压正解 ...