我使用 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()
永远不会抛出错误。
对我来说,我从来没有参与过任何有这样要求的项目。前提是,如果我接到这样的需求,我真的不知道怎么解决。
任何人都可以向我解释它是如何完成的吗?
原文由 kishoredbn 发布,翻译遵循 CC BY-SA 4.0 许可协议
System.out
只是PrintStream
的一个实例。你可以检查它的 JavaDoc 。它的可变性基于 方法重载(具有相同名称但具有不同参数的多个方法)。此打印流将其输出发送到所谓的 标准输出。
在您的问题中,您提到了一种称为 可变参数函数(或 varargs )的技术。不幸的是,
PrintStream#print
不支持它,所以你一定把它误认为是其他东西。然而,在 Java 中实现这些非常容易。 只需检查文档。如果您好奇 Java 如何知道如何连接非字符串变量
"foo" + 1 + true + myObj
,这主要是 Java 编译器的责任。当没有变量参与连接时,编译器只是连接字符串。当涉及变量时,连接被翻译成
StringBuilder#append
链。结果字节码中没有连接指令;即+
运算符(在谈论字符串连接时)在编译期间得到解决。All types in Java can be converted to string (
int
via methods inInteger
class,boolean
via methods inBoolean
class, objects via他们自己的#toString
,…)。有兴趣的可以查看StringBuilder的源码。更新: 我很好奇自己并检查(使用 javap )我的示例
System.out.println("foo" + 1 + true + myObj)
编译成什么。结果: