一尘不染

System.out.print()如何工作?

java

我使用Java已有很长时间了,我想知道函数是如何System.out.print()工作的。

这是我的疑问:

作为一个函数,它在 io
包中的某个位置有一个声明。但是Java开发人员如何做到这一点,因为此函数可以接受任意数量的参数和任何参数类型,而不管它们如何排列?例如:

System.out.print("Hello World");
System.out.print("My name is" + foo);
System.out.print("Sum of " + a + "and " + b + "is " + c);
System.out.print("Total USD is " + usd);

无论变量的数据类型是什么a, b, c, usd, foo或如何传递变量,都System.out.print()不会引发错误。

对我来说,我从未从事过任何要求这样的项目。前提是,如果我收到这样的要求,我真的不知道如何解决。

谁能给我解释一下如何做?


阅读 276

收藏
2020-09-08

共1个答案

一尘不染

System.out只是的一个实例PrintStream。您可以检查其JavaDoc。它的可变性基于
方法重载
(名称相同但参数不同的多个方法)。

该打印流将其输出发送到所谓的
标准输出


在您的问题中,您提到了一种称为 可变参数函数 (或
varargs
)的技术。不幸的是,这不受的支持PrintStream#print,因此您必须将其与其他东西混淆。但是,用Java实现它们非常容易。只需检查文档即可。


而且,如果您好奇Java如何知道如何连接非字符串变量"foo" + 1 + true + myObj,则这主要是Java编译器的责任。

当串联中不涉及任何变量时,编译器仅将字符串串联。当涉及到变量时,串联被转换成StringBuilder#append链。结果字节码中没有连接指令。也就是说,+在编译过程中会解析运算符(在谈论字符串连接时)。

Java中的所有类型都可以转换为字符串(int通过Integer类中的boolean方法,通过Boolean类中的方法,对象通过它们自己的#toString…)。如果您有兴趣,可以检查StringBuilder的源代码。


更新:
我很好奇自己,并检查了(使用javap)示例所System.out.println("foo" + 1 + true + myObj)编译的内容。结果:

System.out.println(new StringBuilder("foo1true").append(myObj).toString());
2020-09-08