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']
答案 0 :(得分:2)
使用扩展转换将char
转换为int
。这在Java语言规范的this section about unary numeric promotion中有所描述,具体来说是:
否则,如果操作数是编译时类型
byte
,short
或char
,则通过扩展原语将其提升为类型int
的值转换(第5.1.2节)。
答案 1 :(得分:1)
Java
会自动将char
强制转换为int
。
这是完全有效的Java
代码:
public static void main(String[] args) {
int field1 = 'a';
System.out.println(field1);
}
答案 2 :(得分:0)
a.charAt(0)
是一个字符,因此它知道在第一行打印a
。
在第二行中,索引始终是一个数字,因此Java会自动将char
值转换为其数字对应值。
这不是一个真正安全的转换,因为a
的具体数值可能因编码而异。
答案 3 :(得分:0)
有一个overload of println
that specifically takes a char
。这将分别处理char
;如果没有此重载,int
重载仍然存在,char
将提升为int
,int
重载将打印97
,这是Unicode代码点(ASCII排列为英文字母,数字和常用标点符号)。
但是,在数组索引上下文中,它会按int
提升为char
。
索引表达式经历一元数字提升(第5.6.1节)。提升类型必须为int,否则会发生编译时错误。
一元数字促销是将int
提升为b[97]
的内容,以便它访问char
。
通常最好避免将int
隐式扩展为b[97]
,以避免出现意外情况,例如访问<param name="app.code">ks-with-rice-bundled-2.0.3-cm</param>
。
答案 4 :(得分:0)
这是由编译器推断的。可以使用char
代替int
。使用上下文确定使用哪一个 - 如果存在歧义,则优先使用给定类型。但是,如果只有其他类型在上下文中起作用(b['a']
显然无效,那么它不适用于转换),则推断出此类型。
答案 5 :(得分:0)
对于以下内容:
System.out.println(a.charAt(0));
Java调用方法PrintStream.println(char x)
,因为您传递了一个字符。所以没问题。
但是对于以下内容:
System.out.println(b[a.charAt(0)]);
再次,a.charAt(0)
返回字符&#39; a&#39;,但这一次,因为你试图获取数组的元素,它会将字符转换为int,因为你需要一个int来访问数组元素。