之前学java就一直存在一个问题为什么在c里面int可以直接赋值给char,
而在java里面要强转类型,现在实验了下发现只有final int才能赋值给char,
希望有人能解惑下
final int 相当于是常量了,
所以可以赋值给char
final修饰的变量在编译的时候就已经分配了内存空间和值。所以在其他地方使用都是直接替换的。如果你把98变大一点如6666666也是需要强转的。
Java语言中,char类型是16bit的二进制数,表示字符的时候采用的是Uncode(UCS2)编码。
这个char类型的本质和short类型差不多,只是,char用来表示字符,short用来表示整数而已。
于是,编译器在常量赋值的时候,就可以把char类型当作short类型来处理,可以直接对常量进行赋值。
变量是在内存的堆区开辟空间进行存放,不同的类型占用的空间不同,
常量是在静态区或者直接编译到代码里面的数据,它不存在内存碎片的问题。
常量向变量进行的赋值,是由编译器进行语法验证和处理的。
Java 的编译器,允许整型常量向char/short等类型直接赋值,并且在编译的时候进行数值范围的校验操作。
final int a = 98;
final short b = 98;
char c = a;
char d = b;
char e = 98;
这些代码都是常量向 char 类型直接赋值,c,d,e 并没有任何区别。
但是,使用的时候,要求你对字符编码要有一定的了解才行。
至于为什么不同类型的变量之间不能直接赋值(有的可以强制类型转换),
那是因为,直接赋值无法保证程序的正确性,比如 int 类型向 short 类型赋值,很可能会存在 int 类型的数据有大于65535
的情况,
如果int类型的数据超出short类型数据所能表示的最大范围,那么,数据表示的信息就会丢失,换句话说,程序的正确性难以保持。
因为变量是在运行时使用的,如果每次赋值操作都进行校验,会使得程序的效率整体降低,得不偿失。
常量能够向变量赋值是因为常量是确定的,编译器在编译的时候就进行了检查和校验,可以避免数值越界之类的事情发生。
一个是运行时的场景,一个是编译时的场景,两者还是有区别的。
看看jvm,常量的处理在编辑器上,变量是二进制码或者Uncode码经过cpu计算的