下面的代码不起作用,编译器说'从int到char可能的有损转换'
public class Main
{
public static void main(String[] args) {
char ch;
ch = 65;
ch=ch+1;
System.out.println(ch);
}
}
然后为什么下面的代码可以正常工作:
public class Main
{
public static void main(String[] args) {
char ch;
ch = 65;
ch+=1;
System.out.println(ch);
}
}
虽然两个代码的唯一区别只是'ch = ch + 1'和'ch + = 1'?
在Java中,char变量的大小为:2个字节,一个int变量的大小为:4个字节。
N.B:一个字节由8位组成,可以保存一个最大为256的数字。
在第一个代码段中,当您执行(ch +1)时,编译器认为默认情况下1是一个int值,因此也将最终值也视为int。然后,编译器尝试将最终值放入ch中,这是一个字符... ops ..它试图将4字节表示的值拟合到大小为2字节的变量中!
如果您这样做,可以解决此问题:频道=(字符)(频道+1)
在第二个代码段中,无论变量ch的大小如何,都直接对其进行递增。因此,您不会遇到试图将int值拟合到char变量中的问题。
由于+=
的结果已转换为左侧变量的类型,因此您的操作ch+=1;
将按以下方式工作:
ch += 1;
^ ^ ------- right hand (int)
+-------------- left hand (char)
将使用例如((int) ch)
将ch转换为int:
然后将((int) ch)
与1
相加并将其强制转换为char以返回原始类型,所有这些都可以作为:
ch = (char) ((int) ch + 1);
如果ch + = 1,则>
内部类型转换将由编译器自动执行
如果是ch = ch + 1
开发人员必须显式地进行类型转换,否则我们将编译时间错误
CE:可能失去进动发现:int必填:char
规则:-如果我们应用任何算术运算符b / w 2个操作数'a'和'b',则结果类型为max(int,a的类型,b的类型)
在Java中,
ch = ch + 1
是隐式变窄转换的一种形式。这就是为什么编译器会引发可能的有损转换。您可以在Google上找到更多有关此的信息>
[ch+=1
等于ch=ch+(char)1
而不是ch=ch+1
在Java中,char变量的大小为:2个字节,一个int变量的大小为:4个字节。