当我执行第一个代码时,我将获得以下输出(而预计会是其他代码)。现在,随着变化很小,结果是不同的。为什么是?
情况1
package mydemo;
public class hw {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("HelloWorld");
int x =10;
int y =20;
int result = x + y;
System.out.println(" result");
}
}
输出:
HelloWorld
result
情况2
package mydemo;
public class hw {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("HelloWorld");
int x =10;
int y =20;
int result = x + y;
System.out.println(" result = " + result);
}
}
输出
HelloWorld
result = 30
您两种情况下的唯一区别是传递给您的参数" println "函数:
在案例1:
System.out.println(" result");
此处参数"结果" (不应省略双引号)是字符串字面。它表示您在 double Quote 符号之间键入的单词本身,并且与您在上一行中定义的int variable result 无关。
因此,当您调用 prinln 时,该函数接收了一个字符串变量并将其打印到控制台。
在情况2:
System.out.println(" result = " + result);
,在上面的情况下,您将表达式"result = " + result
传递给 println 函数,在您的情况下,即 String plus" plus int 变量操作。Java编译器将首先将您的表达式" result = " + result
转换为字符串" result = 30"
,然后将其传递到 println 函数。
编译器对上述表达式所做的工作就像用以下代码替换它:
new StringBuilder(" result = ").append(result).toString();
将产生某种Java字节码如下:
12: invokespecial #26 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
15: iload_1
16: invokevirtual #29 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
19: invokevirtual #33 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
,如果您对编译器如何处理该表达式有兴趣:
也很有用:字符串类如何覆盖 运算符?
当您告诉它:
System.out.println(" result");
它在括号中打印物品,即"结果"。引号围绕着"结果"一词表示它是字符串字面的。因此输出为
result
在第二种情况下,这在括号中:
" result = " + result
您可以看到,我们仍然有一个字符串字面 - " result ="。您看到那里的+
字符吗?那东西连接了东西。因此,在这里,它将"结果="与result
连接。什么是result
?由于它周围没有引号,因此它不是字符串的文字。在这里,result
指的是称为result
的变量的值。有什么价值?30!
这就是为什么它打印的原因:
result = 30