ASCII 和 int 值转换之间的混淆

  • 本文关键字:之间 转换 int ASCII java
  • 更新时间 :
  • 英文 :


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 语言规范中的一元数字提升,具体如下:

否则,如果操作数是编译时类型 byteshortchar,则通过扩大基元转换 (§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的特定数值可能会因您的编码而异。

有一个专门需要charprintln过载。 这将单独处理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 来访问数组元素。

最新更新