为何Jshell中给printf后加println()会屏蔽打印流变量输出?
JShell中printf链式调用println()的输出差异解释
两种执行场景
场景1:仅调用printf()
jshell> System.out.printf("5 * 2 = %d & 8 * 10 = %d", 5*2, 8*10) 5 * 2 = 10 & 8 * 10 = 80$9 ==> java.io.PrintStream@68de145 jshell>
场景2:printf()后链式调用println()
jshell> System.out.printf("5 * 2 = %d & 8 * 10 = %d", 5*2, 8*10).println() 5 * 2 = 10 & 8 * 10 = 80 jshell>
问题解析
核心原因:JShell的输出规则 + 方法返回值类型
用入门级的大白话拆解:
- JShell的默认行为:如果你输入的是一段没有赋值给变量的代码,JShell会自动执行它;如果这段代码有返回值(不是“无返回”的类型),就会把返回值打印出来,还会给它分配一个临时变量(比如例子里的
$9)。 - printf()的返回值:
System.out.printf()执行完内容输出后,会返回它自己所属的打印流对象(也就是System.out对应的PrintStream实例),所以第一种场景里,JShell在输出完计算结果后,又把这个返回的对象打印出来,就是你看到的$9 ==> java.io.PrintStream@68de145。 - println()的返回值:
println()方法的返回值是void,也就是完全没有返回值。当你链式调用printf(...).println()时,整个代码的最终返回值是println()的void,JShell遇到返回值为void的代码,只会执行方法本身(也就是printf输出内容、println换行),不会打印任何返回值相关的内容。
你误以为“变量应该在println换行前输出”,是混淆了链式调用的返回值逻辑:JShell只关心整个代码最后一步的返回值,不会打印中间步骤的返回值。虽然printf确实返回了PrintStream对象,但后续调用println()后,整个代码的结果变成了void,所以JShell不会再打印那个PrintStream对象。
内容的提问来源于stack exchange,提问作者r4dii
相关产品推荐
相关产品推荐

