我使用Java已有很长时间了,我想知道函数是如何System.out.print()工作的。
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()不会引发错误。
a, b, c, usd, foo
对我来说,我从未从事过任何要求这样的项目。前提是,如果我收到这样的要求,我真的不知道如何解决。
谁能给我解释一下如何做?
System.out只是的一个实例PrintStream。您可以检查其JavaDoc。它的可变性基于 方法重载 (名称相同但参数不同的多个方法)。
System.out
PrintStream
该打印流将其输出发送到所谓的 标准输出 。
在您的问题中,您提到了一种称为 可变参数函数 (或 varargs )的技术。不幸的是,这不受的支持PrintStream#print,因此您必须将其与其他东西混淆。但是,用Java实现它们非常容易。只需检查文档即可。
PrintStream#print
而且,如果您好奇Java如何知道如何连接非字符串变量"foo" + 1 + true + myObj,则这主要是Java编译器的责任。
"foo" + 1 + true + myObj
当串联中不涉及任何变量时,编译器仅将字符串串联。当涉及到变量时,串联被转换成StringBuilder#append链。结果字节码中没有连接指令。也就是说,+在编译过程中会解析运算符(在谈论字符串连接时)。
StringBuilder#append
+
Java中的所有类型都可以转换为字符串(int通过Integer类中的boolean方法,通过Boolean类中的方法,对象通过它们自己的#toString…)。如果您有兴趣,可以检查StringBuilder的源代码。
int
Integer
boolean
Boolean
#toString
更新: 我很好奇自己,并检查了(使用javap)示例所System.out.println("foo" + 1 + true + myObj)编译的内容。结果:
System.out.println("foo" + 1 + true + myObj)
System.out.println(new StringBuilder("foo1true").append(myObj).toString());