Java如何理解是替换char还是int?
String a="abc";
int b[]=new int[100];
System.out.println(a.charAt(0)); //prints 'a'
System.out.println(b[a.charAt(0)]); //accesses b[97] and does not give error for b['a']
使用加宽转换将char
转换为int
。本节将介绍 Java 语言规范中的一元数字提升,具体如下:
否则,如果操作数是编译时类型
byte
、short
或char
,则通过扩大基元转换 (§5.1.2) 将其提升为类型int
的值。
>Java
自动将char
转换为int
何时使用 int。
这是完全有效的Java
代码:
public static void main(String[] args) {
int field1 = 'a';
System.out.println(field1);
}
a.charAt(0)
是一个字符,所以它知道在第一行打印a
。
在第二行中,索引始终是一个数字,因此 Java 会自动将char
值转换为其数字对应值。
这不是一个真正的安全转换,因为a
的特定数值可能会因您的编码而异。
有一个专门需要char
的println
过载。 这将单独处理char
;如果没有此重载,int
重载仍将存在,char
将提升为 int
,并且int
重载将打印97
,即 Unicode 码位(ASCII 排列英文字母、数字和常用标点符号)。
但是,在数组索引上下文中,根据 JLS 第 15.10.3 节 "数组访问表达式",它被提升为int
。
索引表达式将经历一元数值提升 (§5.6.1)。升级的类型必须为 int,否则会发生编译时错误。
一元数值提升是将char
提升为int
,以便它访问b[97]
。
通常最好避免将char
隐式扩大到int
,以避免意外情况,例如访问b[97]
。
编译器推断的。可以使用char
代替int
。使用上下文决定了使用哪一个 - 如果存在歧义,则首选给定类型。但是,如果只有另一种类型在上下文中起作用(如果不用于转换,b['a']
显然是无效的),则推断出此类型。
对于以下内容:
System.out.println(a.charAt(0));
Java 调用该方法PrintStream.println(char x)
因为您传递了一个字符。所以那里没有问题。
但对于以下几点:
System.out.println(b[a.charAt(0)]);
再一次,a.charAt(0)
返回字符 'a',但这一次,由于您尝试获取数组的元素,它会将字符转换为 int,因为您需要一个 int 来访问数组元素。