繁体   English   中英

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

[英]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的实例在评估其余语句之前被实例化。

操作顺序是:

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

JVM执行的实际顺序如下:

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

    这里第一个c发送到输出。

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

    这里第二个c发送到输出。

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

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

因此输出结果为cc 1 2

这是因为构造函数中的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打印新计数。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM