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
实际输出
c c 1 2
为什么?
答案 0 :(得分:7)
在这一行:
System.out.println(new W().count+" "+new W().count);
W
的实例在评估其余语句之前被实例化。
操作顺序为:
答案 1 :(得分:7)
JVM执行的实际顺序如下:
实例化第一个W
对象并读取其count
属性。
此处第一个c
将发送至输出。
实例化第二个W
对象并读取其count
属性。
此处第二个c
将发送至输出。
构建了System.out.println()
的字符串参数。 (== "1 2"
)
字符串参数将发送到输出。
因此输出结果为c c 1 2
。
答案 2 :(得分:0)
这是因为构造函数中的System.out.println
语句首先执行,然后只执行调用System.out.println
。请记住在调用System.out.pritnln
之前完全执行的构造函数中的System.out.println
订单是
System.out.println()
因此打印“C”System.out.println()
因此打印“C”System.out.println
将打印新计数。答案 3 :(得分:0)
main中的println方法需要知道它的参数是什么,所以JVM首先构造对象然后将它们发送到println方法
答案 4 :(得分:0)
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);
}
因为 new W()会调用构造函数W()然后它会打印出“C”,之后计数变为1然后你调用 new W()再次,所以另一个“C”就在这里。最后,调用system.out.println(1 +“”+ 2)。那么1 2就在输出缓冲区中。
答案 5 :(得分:0)
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”)
将字符串参数发送到输出。
因此输出结果为c c 1 2。
答案 6 :(得分:0)
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中的运算符优先级有关。
new 运算符优先于连接,这就是为什么第二个新运算符优先于连接运算符而第二个c正在进行打印的原因。 在第二次调用新的W()后,Statement将如下所示。
System.out.println(1 +""+2);
,输出结果为: - c c 1 2