以下代码的输出为123
,因为substring
从beginIndex到EndIndex - 1.但是,我很惊讶char
在这里被理解为3(int)因为{ {1}}采取两个整数。这背后的概念是什么?
substring
答案 0 :(得分:12)
这可以追溯到C,其中char
本质上是一个窄整数类型,并在必要时隐式转换为int
。
在Java中,这在技术上称为“扩展原始转换”,并在section 5.1.2 of the JLS中介绍。
答案 1 :(得分:3)
其他人已经解释了为什么它有效但注意到使用char变量作为索引是不好的做法,因为它们具有不同的关联语义,因此使用char作为索引会让人感到困惑。
仅使用chars存储字符数据,可能更好:尽量避免使用char,因为它们甚至不足以存储每个字符(请参阅Unicode和代码点讨论)。使用int来存储字符代码点。
答案 2 :(得分:0)
所以substring的函数声明看起来像substring(int startIndex,int endIndex)。 现在当你传递char时,它会自动提升为整数(endIndex),因此被视为int。
答案 3 :(得分:0)
查看5.1.2部分,其中讨论了扩大转化次数。
答案 4 :(得分:0)
这称为隐式投射。如果为double赋值,则会出现相同的情况。 快速示例
double d = 1;
1是int
,但会隐式转换为double
(1.0)。
答案 5 :(得分:0)
在char a = 3;
中,您可以将其视为存储0011
,二进制值为3. char'3'实际上并未存储:如果您尝试处理的是char,则会没有得到3
。但如果你做了
char a = '3';
现在你要存储char 3,ascii值为51,如果你尝试在int中使用它,你会得到51.
答案 6 :(得分:0)
从技术上讲,这是因为char
是int
的子类型。
要确定substring(int,int)
是否适用于参数(int,char)
,我们首先尝试15.12.2.2 Phase 1: Identify Matching Arity Methods Applicable by Subtyping,我们需要测试char
是否为int
的子类型。 Per 4.10.1 Subtyping among Primitive Types,它是。
然后,要根据char
参数为int
参数分配char
,我们会应用15.12.4.5 Create Frame, Synchronize, Transfer Control,将int
转换为{{1}} },5.3 Method Invocation Conversion
答案 7 :(得分:0)
这是隐式和显式强制转换的概念。 char是小数据类型,然后是整数,因此当将字符作为值传递时,它将自动将char值转换为int值。
public static void age (int num){
System.out.println(num);
}
char character = '2';
age(character); output is 50.
字符格式“ 0”至“ 9”打印值48至57