表达式转型注意事项,和final修饰的变量会被JVM优化

1java中表达式转型需要注意

实例如下:

byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2);
System.out.println(b3+b6);

问会出现什么状况:A、输出结果:13,B、b6=b4+b5 编译出错   C、b3=b1+b2编译出错   D、运行异常

首先表达式转型注意以下规则:

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

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

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

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

首先2个byte类型相加,会自动提升为int,计算的结果也是int因此需要强制转化会byte,而被fianl修饰的变量不会改变,会被JVM优化,当2个final修饰相加时候会根据左边变量的类型而转化,作为这2个final变量的最终类型。

如下面的代码:

编译运行都是通过的,final int和final byte相加是整形和byte型都可以,不需要强制转换。

public static void main(String[] args) {
	final int a=2;
	final byte a2=3;
	int a3=a+a2;
	byte a4=a+a2;
	System.out.println(a4);
	}

  

时间: 2024-10-14 15:53:45

表达式转型注意事项,和final修饰的变量会被JVM优化的相关文章

final修饰的变量是引用不能变还是对象的内容不能变?

int a=1;此时a是变量: StringBuffer a=new StringBuffer();此时a就是引用变量,可以说是a引用String对象,通过a来操作String 对象 final StringBuffer a=new StirngBuffer(); a=new StringBuffer();会报错: a.append("两");没错 这就说明final 修饰的变量是引用不能变,对象的内容可以变的:

final修饰的变量是引用不能改变还是引用的对象不能改变

我们都知道final修饰变量时 会变为常量,但是使 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 下面让我们来看这段代码: /** * 验证final修饰的变量是引用不能变,还是引用的对象不能变 * StringBuilder 线程不安全 但速度快 * 引用初始化以后不能被改变 --- 不是指变量的值不可变,而是指向的变量地址不可变 * @author Tomato * */ public class TestFinal { public static void mai

final修饰的变量引用不能变还是对象不可变

两种情况:如果是基本数据类型,被final修饰的变量一旦初始化就不能改变:如果是引用数据类型的变量,初始化之后不能只想另外一个对象. 基本数据类型: package cn.yqg.day2; public class StringTest { public static void main(String[] args) { final int a; int b=234; a=b; System.out.println(a); } } 我们看到上面的代码a是final类型的,但是没有被初始化,所以

浅谈final修饰的变量

一直大概的知道final关键字的作用,但是自己实际工作中却很少用,除非在声明一些常量值的时候,今天忽然自己在项目中用一个map进行存储一些值.一开始我只是用private修饰的,心里想的是如果final修饰的话,应该不能修改了.毕竟被final修饰的变量不可变.今天回家后,做了下面的尝试,彻底暴露出自己基础的不扎实. final的作用 被final修饰的类不可以被继承 被final修饰的方法不可以被重写 被final修饰的变量不可变 实战演示 1.首先看下面代码 public class Fin

并不是static final 修饰的变量都是编译期常量

见代码 public class Test { public static void main(String[] args){ // 情况一 基本数据类型 //System.out.println(Outer.Inner.n); // 输出结果 : 10 //情况二 //Outer outer = Outer.Inner.outer; // 输出结果 : 静态内部类 //情况三 System.out.println(Outer.Inner.str); // 输出结果: 静态内部类 abc //情

final修饰的变量是引用不能改变,还是引用的对象不能改变???

对于这个问题,我们不能只记结论,要拿实例说话,参看以下代码: public class Demo { public static void main(String[] args) { final StringBuilder sb = new StringBuilder("haha"); //同一对象的hashCode值相同 System.out.println("sb中的内容是:" + sb); System.out.println(sb + "的哈希编码

final修饰符

final修饰变量时,表示该变量一旦获得了初始值就不可改变, 由于final变量获得初始值之后不能被重新赋值,因此final修饰成员变量和修饰局部变量时有一定的不同. 5.4.1final成员变量 成员变量是随类初始化或对象初始化而初始化的, 当类初始化时,系统会为该类的类变量分配内存,并分配默认值: 当创建对象时,系统会为该对象的实例变量分配内存,并分配默认值. java语法规定:final修饰的成员变量必须由程序员显式地指定初始值 归纳: final修饰的类变量,实例变量 能指定初始值的地方

java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

是引用对象的地址值不能变,引用变量所指向的对象的内容是可以改变. final变量永远指向这个对象,是一个常量指针,而不是指向常量的指针. 例如:final StringBuffer sbu = new StringBuffer(“abc”); 在对其进行重新赋值 sbu = new StringBuffer(“”); 会出现编译错误,被final修饰的变量是不能被重新赋值的. sbu.append(“d”); 是可以编译通过的; final:最终.作为一个修饰符 1.可以修饰类.变量.函数. 2

final修饰的类,其属性和方法默认是被final修饰的吗?

在论坛上,看到一个问题,当然,各位聪明的客官想必已经知道问题是什么了,嘿嘿,没错就是文章的标题:final修饰的类,其属性和方法默认是被final修饰的吗? 老实说,刚开始看到这个问题的时候,有点懵...(现场捕获懵比一只:),嘻嘻),之前学习的语法什么的,隔了太久忘记了...既然忘记了,就写个程序进行测试下吧 嘻嘻,以下是测试的程序:(小程序中用到了反射机制,还没学习到的客官,可以先去了解下哈:) ) /** * DateAndTime: 2016-12-13下午10:38:08 */ pac