Java中println()方法的奇怪行为

时间:2013-09-24 08:47:52

标签: 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

实际输出

  

c c 1 2

为什么?

7 个答案:

答案 0 :(得分:7)

在这一行:

System.out.println(new W().count+" "+new W().count);

W的实例在评估其余语句之前被实例化。

操作顺序为:

  1. 实例化第一个新的W(),导致c被打印
  2. 评估第一个新的W()。count
  3. 实例化第二个新W(),导致c被打印
  4. 评估第二个新的W()。count
  5. 连接结果并打印。

答案 1 :(得分:7)

JVM执行的实际顺序如下:

  1. 实例化第一个W对象并读取其count属性。

    此处第一个c将发送至输出。

  2. 实例化第二个W对象并读取其count属性。

    此处第二个c将发送至输出。

  3. 构建了System.out.println()的字符串参数。 (== "1 2"

  4. 字符串参数将发送到输出。

  5. 因此输出结果为c c 1 2

答案 2 :(得分:0)

这是因为构造函数中的System.out.println语句首先执行,然后只执行调用System.out.println。请记住在调用System.out.pritnln之前完全执行的构造函数中的System.out.println 订单是

  • new W()会调用System.out.println()因此打印“C”
  • 再次使用新的W()会调用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