将char传递给带有int参数的方法

时间:2011-10-28 16:08:21

标签: java type-conversion

以下代码的输出为123,因为substring从beginIndex到EndIndex - 1.但是,我很惊讶char在这里被理解为3(int)因为{ {1}}采取两个整数。这背后的概念是什么?

substring

8 个答案:

答案 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)

从技术上讲,这是因为charint的子类型。

要确定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