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

新手上路,请多包涵

我使用 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 许可协议

阅读 373
2 个回答

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 in Integer class, boolean via methods in Boolean class, objects via他们自己的 #toString ,…)。有兴趣的可以查看StringBuilder的源码。


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

 System.out.println(new StringBuilder("foo1true").append(myObj).toString());

原文由 Pavel Horal 发布,翻译遵循 CC BY-SA 3.0 许可协议

了解 System.out.print 的工作原理是一个非常敏感的点。如果第一个元素是字符串,则加号 (+) 运算符用作字符串连接运算符。如果第一个元素是整数,则加号 (+) 运算符用作数学运算符。

 public static void main(String args[]) {
    System.out.println("String" + 8 + 8); //String88
    System.out.println(8 + 8+ "String"); //16String
}

原文由 Samet ÖZTOPRAK 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题