当使用+-*/%运算时,遵循以下规则:
1.当两个操作数有一个为double时,另外一个也会转化为double类型,并且结果也会转换成double类型
2.当两个操作数有一个为float时,另外一个也会转化为float类型,结果也是float
3.当两个操作数有一个为long时,另外一个也会转化为long类型,并且结果也为long
4.除此以外的所有基本数据类型(short,byte,int,char),都会先转换成int型
5.被final修饰的变量不会进行数值转换
例如:
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 +=1;有什么错?
答:对于short s1=1;s1=s1+1来说,在s1+1运算时会自动提升表达式的类型为int,那么将int赋予给short类型的变量s1会出现类型转换错误。
对于short s1=1;s1+=1来说 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
面试题:
/*
面试题:
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
那句是编译失败 的呢?为什莫尼?
遇到这样的题目主要看等号右边的表达式的形式,变量相加还是常量相加
*/
class Test
{
public static void main(String[] args)
{
byte b1=3,b2=4,b,bb;
//b=b1+b2;错误 错误,可能损失精度
bb=(byte)(b1+b2);
/*
以上代码的步骤分析:
byte 有三个变量:b1 b2 b
等号是把b1+b2做加法操作(类型 比int类型小,变量在做加法的时候要找到最大数值类型,没有long、没有float、没有double)int类型
把操作后的结果int 类型给了(byte)类型,强制类型转换
*/
b=3+4;//正确 b=byte 7
/*
以上代码的步骤分析:
3是一个人常量,4是一个常量。常量加常量结果还是常量
注意:
在编译时就能决定程序是否错误。会把常量值判断在不在当前数据类型的范围内,会把当前的常量值看成我所属的类型
*/
}
}