【java类型转换】

int a ;

float b;

两种情况:

1,a+=b:

//j 按如下方法解析:

a = (int)((float)a + b);


2,a = a+b;

//按照如下方法解析

a = (float)a+b;


所以  a= a+b会报错  而a+=b不会。


-----------------------------其他:

Java编译器会在编译期或者运行期将byte和short类型的数据带符号扩展为相应的int类型数据,

将boolean和char类型数据零位扩展为相应的int类型数据。


因此,在处理boolean 、byte、short 和 char 类型的数组是,也会用相应的int类型的字节码指令来处理。因此,大多数对于上述类型数据的操作,实际上都是使用相应的 int 类型作为运算类型。


如果是final 修饰的变量,进行运算的时候则不会出现类型转换异常。

public class Test {
 final int d = 3; 
 public static void main(String[] args){
  final short  a = 1;
  final short  b =2;
  short c=a+b;
 }
}

编译后使用反编译软件打开后,代码被解析成了这样:

public class Test
{

 final int d = 3;

 public Test()
 {
 }

 public static void main(String args[])
 {
  short a = 1;
  short b = 2;
  short c = 3;
 }
}

可以看到,对于final 修饰的基本类型的变量来说,他们之间的运算直接就被硬编码成了直接赋值语句,连中间结果都没有了,类型转换的异常也就没了。

此外,我们可以注意到,对于方法内的final 变量 a , b 来说,编码时被直接省略了。而Test 类的final 成员变量 d 依然保留着final 属性。

所以说,是否使用final修饰方法中普通变量对JVM来说没有区别!使用final修饰方法中普通变量主要是为了给Java前端编译器(如javac)看的!也就是说方法中被final修饰的普通变量在前端编译时被javac检查并保证该变量不会在作用域内被改变新值,但被编译成字节码后用于修饰方法中普通变量的final就已经不存在了!说的再具体点就是你用或不用final修饰方法中普通变量而生成的字节码文件(.class文件)没有区别。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值