[英]Weird behavior of println() method in Java
class W {
static int count=0;
W() {
count++;
System.out.print("c ");
}
public static void main(String[] args) {
System.out.println(new W().count+" "+new W().count);
}
}
预期产出
c 1 c 2
实际输出
cc 1 2
为什么?
在这一行:
System.out.println(new W().count+" "+new W().count);
W
的实例在评估其余语句之前被实例化。
操作顺序是:
JVM执行的实际顺序如下:
实例化第一个W
对象并读取其count
属性。
这里第一个c
发送到输出。
实例化第二个W
对象并读取其count
属性。
这里第二个c
发送到输出。
构建System.out.println()
的字符串参数。 (== "1 2"
)
字符串参数将发送到输出。
因此输出结果为cc 1 2
。
这是因为构造函数中的System.out.println
语句首先执行,然后只执行调用System.out.println
。 记住构造函数中的System.out.pritnln
在调用System.out.println
之前完全执行顺序是
System.out.println()
因此打印“C” System.out.println()
因此打印“C” System.out.println
打印新计数。 main中的println方法需要知道它的参数是什么,所以JVM首先构造对象然后将它们发送到println方法
class W {
static int count=0;
W() {
count++;
System.out.print("c ");
}
public static void main(String[] args) {
System.out.println(new W().count+" "+new W().count);
}
因为新的W()将调用构造函数W()然后它将打印出“C”,之后计数变为1然后再次调用新的W() ,所以另一个“C”就在这里。 最后,调用system.out.println(1 +“”+ 2)。 然后1 2在输出缓冲区中。
class W {
static int count=0;
W() {
count++;
System.out.print("c ");
}
public static void main(String[] args) {
//modify System.out.println(new W().count+" "+new W().count);
System.out.print(new W().count + " ");
System.out.print(new W().count);
}
}
OUTPUT
c 1 c 2
JVM执行的实际顺序如下:
实例化第一个W对象并读取其count属性。
这里第一个c发送到输出。
实例化第二个W对象并读取其count属性。
这里第二个c发送到输出。
构建System.out.println()的字符串参数。 (“1 2”)
字符串参数将发送到输出。
因此输出结果为cc 1 2。
class W {
static int count=0;
W() {
count++;
System.out.print("c ");
}
public static void main(String[] args) {
System.out.println(new W().count+" "+new W().count);
}
}
这与java中的运算符优先级有关。
新的运算符优先于连接,这就是为什么第二个新运算符优先于连接运算符而第二个c正在进行打印的原因。 在第二次调用新的W()之后,Statement将会是这样的。
System.out.println(1 +""+2);
输出将是: - cc 1 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.