当使用 + - * / % 等数学运算时,遵循以下原则:
- 只要两个操作数中有一个是
double
类型的,另一个将会被转换成double
类型,并且结果也是double
类型。 - 只要两个操作数中有一个是
float
类型的,另一个将会被转换为float
类型,并且结果也是float
类型。 - 只要两个操作数中有一个是
long
类型的,另一个将会被转换成long
类型,并且结果也是long
类型。 - 否则(操作数为
byte
、short
、int
、char
),两个操作数都会被转换成int
类型,并且结果也是int
类型。 - 但是
final
修饰的域类型不会发生上述变化(final修饰的常量值不能变,连类型也不能变)。
原程序:请选出下列程序出错的语句:
public class ShuJuLeiXingZhuanHuan {
byte b1=1, b2=2, b3, b6, b8;
final byte b4=4, b5=5, b7=7;
public void fun() {
// 1.b3 = (b1+b2);
// 2.b6 = (b4+b5);
// 3.b7 = (b1+b3);
// 4.b8 = (b1+b4);
}
public static void main(String[] args) {
new ShuJuLeiXingZhuanHuan().fun();
}
}
① b3 = (b1+b2);
:等式右边的b1和b2==都是byte类型,进行算术运算时都会转换成int类型,结果也是int类型,而等式左边的b3是byte类型,从int转换到byte类型会有精度丢失,需要强转,即b3 = (byte)(b1+b2);
。
② b6 = (b4+b5);
:等式右边的b4和b5都是final修饰的byte类型,在进行算术运算时不会发生类型转换,所以结果是byte类型,而等式右边的b6也是byte类型,没有问题。
③ b7 = (b1+b3);
:等式的左边的b7是final修饰的byte类型,值是不能变的,把b1和b3的和赋值给b7本来就是错的,更何况数据类型了。
④ b8 = (b1+b4);
:等式右边的b1是byte类型,运算时转换为int型,b4是final修饰的byte类型运算时不会发生类型上的转换,int+byte还是int,而等式左边的b8是个byte型,从int转换到byte类型会有精度丢失,需要强转,即b8 = (byte)(b1+b4);
。
修改之后的程序:
public class ShuJuLeiXingZhuanHuan {
byte b1=1, b2=2, b3, b6, b8;
final byte b4=4, b5=5, b7=7;
public void fun() {
b3 = (byte)(b1+b2);
b6 = (b4+b5);
//错误的b7 = (b1+b3);
b8 = (byte)(b1+b4);
}
public static void main(String[] args) {
new ShuJuLeiXingZhuanHuan().fun();
}
}
经过修改之后的程序就是对的了,因为这里没有任何输出的语句,所以不会打印出任何东西,但是证明程序运行起来是没有什么问题的~~