我使用Java已经很长时间了,我想知道这个函数是如何实现的System.out.print()
works.
这是我的疑问:
作为一个函数,它在某处有一个声明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()
永远不会抛出错误。
对我来说,我从来没有参与过任何有这样要求的项目。前提是,如果我遇到这样的需求,我真的不知道如何解决。
谁能向我解释它是如何完成的?
System.out
只是一个实例PrintStream
。你可以检查它的JavaDoc。其可变性基于方法重载(多个方法具有相同的名称,但具有不同的参数)。
该打印流将其输出发送到所谓的标准输出.
在你的问题中你提到了一种称为可变参数函数 (or varargs)。不幸的是,这不支持PrintStream#print
,所以你一定把它误认为是其他东西了。然而,用 Java 实现这些是非常容易的。只需检查文档即可。
如果您好奇 Java 如何知道如何连接非字符串变量"foo" + 1 + true + myObj
,它主要是Java编译器的职责。
当连接中没有涉及变量时,编译器只是连接字符串。当涉及到变量时,连接会被转换为StringBuilder#append链。生成的字节码中没有串联指令;即+
运算符(当谈论字符串连接时)在编译期间解决。
Java中的所有类型都可以转换为字符串(int
通过方法Integer
class, boolean
通过方法Boolean
类,对象通过自己的#toString
,...)。如果有兴趣可以查看StringBuilder的源代码。
UPDATE:我自己很好奇并检查了(使用javap)我的例子是什么System.out.println("foo" + 1 + true + myObj)
编译成.结果:
System.out.println(new StringBuilder("foo1true").append(myObj).toString());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)