今天无意发现这样一道题,可以先做做看:

正确答案是BCD。

至于原因有人给出了参考答案:

1、所有的byte,short,char型的值将被提升为int型;

2、如果有一个操作数是long型,计算结果是long型;

3、如果有一个操作数是float型,计算结果是float型;

4、如果有一个操作数是double型,计算结果是double型;

5、被fianl修饰的变量不会自动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型而转化。
 
其中第5项就很模糊了,啥叫根据左边的变量而变化??。
在此做出以下测试:
 
 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那个变量名用其常量值进行带入,再判断是否发生各种错误即可。

这时候,我们再回到最开始的那道题就很好解了:

  1. b3=(b1+b2);  /*语句1*/  ——>  b3 = b1+ b2;  // 错,右边整形计算默认使用int,最终为int  而左边为byte类型,大变小需要强转
  2. b6=b4+b5;    /*语句2*/   ——>  b6 = 4+ 6;      //正确
  3. b8=(b1+b4);  /*语句3*/  ——>  b8 = b1+ 4;  // 错,同1
  4. 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”修饰基本类型的注意事项的更多相关文章

  1. java中的final与可变类型、不可变类型的关系

    如果你对final和不可变类型的概念与区别有疑问的话,可以打开这篇文章.希望我的解答可以帮到您! 1.不可变类型: 什么是可变类型,什么是不可变类型呢? 首先我们看一下下面的这行代码: String ...

  2. Java中的final修饰符

    1.什么时候可以选择final修饰符 如果想让一个类不被其他类继承,不允许在有子类,这时候就要考虑用到final来修饰. 2.用final修饰的类 首先大家要明白,用final修饰的类是不能被继承的, ...

  3. Java基础-被final修饰的引用变量的指向

    final修饰的引用变量一旦初始化赋值之后就不能再指向其他的对象,那么该引用变量指向的对象的内容可变吗?看下面这个例子: public class Test { public static void ...

  4. java基础 关于final修饰符

    final作为一个修饰符,可以修饰类.变量.函数. 1.被final修饰的类不可以被继承(保护封装性),为了避免被继承,被子类复写: 2.被final修饰的函数不可以被复写 3.被final修饰的变量 ...

  5. 对于final修饰的类型运算时的表现

    我们知道,对于byte,char,这些数据类型加减时都会转化成int在运算,然而,对于final修饰过的数据是不会发生转换的. 比如说 byte b1=1; byte b2=2; byte b3=b1 ...

  6. Java学习:final关键字的使用与注意事项

    final 关键字代表最终.不可改变的. 常见的四种用法 可以用来修饰一个类 可以用来修饰一个方法 可以用来修饰一个局部变量 可以用来修饰一个成员变量 1.当final关键字用来修饰一个类的时候,格式 ...

  7. Java学习——使用final修饰符

    package Pack1; import java.awt.*; import java.applet.*; class ca { static int n = 20; final int nn; ...

  8. Java final修饰形参

    转自:http://java.chinaitlab.com/base/836044.html public class BB{ public int i; } public class PP{ pub ...

  9. 【JAVA】final修饰Field

    一.简介 final修饰符可以用来修饰变量.方法.类.final修饰变量时一旦被赋值就不可以改变. 二.final成员变量 成员变量是随类初始化或对象初始化而初始化的.当类初始化的时候,会给类变量分配 ...

随机推荐

  1. nginx+redis实现session的共享

    上一篇我们介绍了nginx实现的负载均衡和动静分离,可看这边. 我们在文章的末尾说到,负载均衡需要面临的一个问题是内存数据的同步.例如:我有A,B两台服务器做了负载均衡,当我在A服务器上执行了登录并且 ...

  2. ansible编译httpd playbook示例

    以下是playbook的内容.它的处理流程是: 1.先在本地下载apr,apr-util,httpd共3个.tar.gz文件. 2.解压这3个文件. 3.安装pcre和pcre-devel依赖包. 4 ...

  3. 《TCP-IP详解卷2:实现》【PDF】下载

    <TCP-IP详解卷2:实现>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 内容简介 <TCP/IP详解·卷2 ...

  4. C# 委托与事件详解(三)

    今天我接着上面的3篇文章来讲一下,为什么我们在日常的编程活动中遇到这么多sender,EventArgs e 参数:protected void Page_Load(object sender, Ev ...

  5. 小白的Python之路 day3 函数式编程,高阶函数

    函数式编程介绍   函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的 ...

  6. Python学习日记:day9--------函数

    初识函数 1,自定义函数 s ='内容' #自定义函数 def my_len():#自定义函数没有参数 i =0 for k in s: i+=1 print(i) return i #返回值 my_ ...

  7. .NET开发一个微信跳一跳辅助程序

    昨天微信更新了,出现了一个小游戏"跳一跳",玩了一下 赶紧还蛮有意思的 但纯粹是拼手感的,玩了好久,终于搞了个135分拿了个第一名,没想到过一会就被朋友刷下去了,最高的也就200来 ...

  8. 1_3 C语言解决求n!

    求n!(n为键盘输入的任意整数值).要求分别用while语句和for语句实现 用while语句实现: #include <stdio.h> int main() { int n; scan ...

  9. Windows下RabbitMQ安装及入门

    1.Windows下安装RabbitMQ需要以下几个步骤 (1):下载erlang,原因在于RabbitMQ服务端代码是使用并发式语言erlang编写的,下载地址:http://www.erlang. ...

  10. JavaScript的简单入门

    一.导读 简介:JavaScript简称js,是基于对象和事件驱动的脚本语言,主要运用于客户端.原名LiveScript,本身和Java没有任何关系,但语法上很类似. 特点:交互性(它可以做的就是信息 ...