java – 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()都不会抛出错误.
对我来说,我从未参与任何需求如此的项目.如果我得到这样的要求,我真的不知道如何解决它.
任何人都可以向我解释它是如何完成的吗?
解决方法:
System.out只是PrintStream的一个实例.您可以检查其JavaDoc.它的可变性基于method overloading(多个方法具有相同的名称,但具有不同的参数).
该打印流将其输出发送到所谓的standard output.
在你的问题中,你提到了一种名为variadic functions(或varargs)的技术.不幸的是,PrintStream #print不支持,因此您必须将其与其他内容混淆.但是,在Java中实现它们非常容易. Just check the documentation.
如果你很好奇Java如何知道如何连接非字符串变量“foo”1 true myObj,它主要负责Java编译器.
当串联中没有涉及变量时,编译器只是连接字符串.当涉及变量时,串联将转换为StringBuilder#append
链.结果字节代码中没有连接指令;即在编译期间解析运算符(当谈论字符串连接时).
Java中的所有类型都可以转换为字符串(int通过Integer类中的方法,boolean通过布尔类中的方法,对象通过自己的#toString,…).如果您有兴趣,可以查看StringBuilder的源代码.
更新:我很好奇自己并检查(使用javap)我的示例System.out.println(“foo”1 true myObj)编译成.结果:
System.out.println(new StringBuilder("foo1true").append(myObj).toString());
标签:java,system-out 来源: https://codeday.me/bug/20190917/1809949.html