System.out.println 同时使用 String 和 int 时的行为
System.out.println behavior when using String and int together
考虑以下代码片段 -
public class Student {
public static void main(String args[]) {
int a = 3;
int b = 4;
System.out.println(a + b +" ");
System.out.println(a + b +" "+ a+b);
System.out.println(""+ a+b);
}
}
上述代码片段的输出为 -
7
7 34
34
从输出中可以清楚地看出,如果我们首先在 print 语句中使用 String,那么整数将被连接起来。但是,如果我们首先使用整数,然后添加并显示值。
有人可以解释为什么会出现这种行为吗?
我什至试图查看 PrintStream 中 println() 方法的实现 class 但无法弄清楚。
实际上,造成这种情况的不是 println()
实现,这是 Java
在处理 Strings
时处理 +
运算符的方法。
实际上操作是从左到右处理的,所以:
- 如果
string
在操作 int
(或任何其他类型)之前出现,则使用 String
conversion 并且所有其余操作数将被视为 strings
,并且它只包含一个String
级联操作。
- 如果
int
在操作中先出现,它将被视为int
,因此使用addition
操作。
这就是为什么a + b +" "
给出7
的原因,因为String
在运算的末尾,而对于其他表达式a + b +" "+ a+b
或""+ a+b
,变量a
和 b
如果在表达式中出现在 String
之后,将被视为 strings
。
有关详细信息,您可以查看 String Concatenation Operator + in Java Specs。
第一种情况:
System.out.println(a + b +" ");
在这个顺序中,a + b
首先被计算为一个整数和,然后在添加space时转换为一个字符串(这里的第二个+
用于字符串连接) .
第二种情况:
System.out.println(a + b +" "+ a+b);
这里第一部分是int sum运算,然后转换为字符串,因为我们添加了space(第二个+
用于字符串连接),其余部分将是字符串连接作为左操作数已经是一个字符串。
第三种情况:
System.out.println(""+ a+b);
与第二个相同。
备注:
为了改变这种行为,只需在 string
连接之前添加括号以强制 int
总和。
与println
的实现无关。在执行 println
之前评估传递给 println
的表达式的值。
它是从左到右计算的。只要 +
的两个操作数都是数字,就会执行加法。一旦至少一个操作数是 String
,将执行 String
连接。
System.out.println(a + b + " ");
// int + int int + String
// addition, concatenation
System.out.println(a + b + " " + a + b);
// int + int int + String Str+Str Str+Str
// addition, concat, concat, concat
System.out.println("" + a + b);
// String+int String+int
// concat, concat
考虑以下代码片段 -
public class Student {
public static void main(String args[]) {
int a = 3;
int b = 4;
System.out.println(a + b +" ");
System.out.println(a + b +" "+ a+b);
System.out.println(""+ a+b);
}
}
上述代码片段的输出为 -
7
7 34
34
从输出中可以清楚地看出,如果我们首先在 print 语句中使用 String,那么整数将被连接起来。但是,如果我们首先使用整数,然后添加并显示值。
有人可以解释为什么会出现这种行为吗?
我什至试图查看 PrintStream 中 println() 方法的实现 class 但无法弄清楚。
实际上,造成这种情况的不是 println()
实现,这是 Java
在处理 Strings
时处理 +
运算符的方法。
实际上操作是从左到右处理的,所以:
- 如果
string
在操作int
(或任何其他类型)之前出现,则使用String
conversion 并且所有其余操作数将被视为strings
,并且它只包含一个String
级联操作。 - 如果
int
在操作中先出现,它将被视为int
,因此使用addition
操作。
这就是为什么a + b +" "
给出7
的原因,因为String
在运算的末尾,而对于其他表达式a + b +" "+ a+b
或""+ a+b
,变量a
和 b
如果在表达式中出现在 String
之后,将被视为 strings
。
有关详细信息,您可以查看 String Concatenation Operator + in Java Specs。
第一种情况:
System.out.println(a + b +" ");
在这个顺序中,a + b
首先被计算为一个整数和,然后在添加space时转换为一个字符串(这里的第二个+
用于字符串连接) .
第二种情况:
System.out.println(a + b +" "+ a+b);
这里第一部分是int sum运算,然后转换为字符串,因为我们添加了space(第二个+
用于字符串连接),其余部分将是字符串连接作为左操作数已经是一个字符串。
第三种情况:
System.out.println(""+ a+b);
与第二个相同。
备注:
为了改变这种行为,只需在 string
连接之前添加括号以强制 int
总和。
与println
的实现无关。在执行 println
之前评估传递给 println
的表达式的值。
它是从左到右计算的。只要 +
的两个操作数都是数字,就会执行加法。一旦至少一个操作数是 String
,将执行 String
连接。
System.out.println(a + b + " ");
// int + int int + String
// addition, concatenation
System.out.println(a + b + " " + a + b);
// int + int int + String Str+Str Str+Str
// addition, concat, concat, concat
System.out.println("" + a + b);
// String+int String+int
// concat, concat