System.out.println(Object) 是 Java 中最常用的输出方法之一,它的行为等同于 java.io.PrintStream#println(Object),因为 System.out 是一个 PrintStream 实例。- package java.lang;
- public final class System {
- /**
- * The "standard" output stream. This stream is already
- * open and ready to accept output data. Typically this stream
- * corresponds to display output or another output destination
- * specified by the host environment or user.
- * <p>
- * For simple stand-alone Java applications, a typical way to write
- * a line of output data is:
- * <blockquote><pre>
- * System.out.println(data)
- * </pre></blockquote>
- * <p>
- * See the println methods in class PrintStream.
- *
- * @see java.io.PrintStream#println()
- * @see java.io.PrintStream#println(boolean)
- * @see java.io.PrintStream#println(char)
- * @see java.io.PrintStream#println(char[])
- * @see java.io.PrintStream#println(double)
- * @see java.io.PrintStream#println(float)
- * @see java.io.PrintStream#println(int)
- * @see java.io.PrintStream#println(long)
- * @see java.io.PrintStream#println(java.lang.Object)
- * @see java.io.PrintStream#println(java.lang.String)
- */
- public final static PrintStream out = null;
- }
复制代码 java.io.PrintStream#println(Object) 方法会打印对象的 字符串表示形式,其行为由 Java 语言规范定义,具体实现如下:- // class java.io.PrintStream
- public void println(Object x) {
- String s = String.valueOf(x); // 关键转换
- synchronized (this) {
- print(s);
- newLine(); // 添加换行符
- }
- }
复制代码 其中,java.lang.String#valueOf(Object) 描述了对象转字符串的机制。- // class java.lang.String
- public static String valueOf(Object obj) {
- return (obj == null) ? "null" : obj.toString();
- }
复制代码 继续来看Object.toString方法,该方法返回一个类名@十六进制哈希码串。见如下java源码:- // class java.lang.Object
- /**
- * Returns a string representation of the object. In general, the
- * {@code toString} method returns a string that
- * "textually represents" this object. The result should
- * be a concise but informative representation that is easy for a
- * person to read.
- * It is recommended that all subclasses override this method.
- * <p>
- * The {@code toString} method for class {@code Object}
- * returns a string consisting of the name of the class of which the
- * object is an instance, the at-sign character `{@code @}', and
- * the unsigned hexadecimal representation of the hash code of the
- * object. In other words, this method returns a string equal to the
- * value of:
- * <blockquote>
- * <pre>
- * getClass().getName() + '@' + Integer.toHexString(hashCode())
- * </pre></blockquote>
- *
- * @return a string representation of the object.
- */
- public String toString() {
- return getClass().getName() + "@" + Integer.toHexString(hashCode());
- }
复制代码 示例代码演示
- // 普通对象(未重写 toString)
- Object obj = new Object();
- System.out.println(obj); // 输出: java.lang.Object@6d06d69c
复制代码
- 如果需要友好打印,可以重新 toString 方法
- // 重写 toString 的对象
- class Person {
- String name;
- Person(String name) { this.name = name; }
- @Override
- public String toString() { return "Person: " + name; }
- }
- System.out.println(new Person("Alice")); // 输出: Person: Alice
复制代码 lombok工具会为class类生成 toString 方法。见下方示例:- @ToString
- public class Person {
- int age;
- String name;
-
- Person(String name) { this.name = name; }
- }
- // 上面class经过IDE build以后,会生成如下代码中的 toString方法
- public class Person {
- int age;
- String name;
- Person(String name) {
- this.name = name;
- }
- public String toString() {
- return "Person(age=" + this.age + ", name=" + this.name + ")";
- }
- }
复制代码
anyway,生产环境要严谨使用System.out.println来打印对象,PrintStream是同步的,会影响程序性能,尤其是多线程环境下会成为性能瓶颈。相比之下,我们借助更具优势的日志框架,例如SLF4J+Logback组合,来实现程序日志的打印。
日志框架的优势:
- 异步输出:通过AsyncAppender实现非阻塞日志
- 级别控制:动态调整日志级别(TRACE/DEBUG/INFO/WARN/ERROR)
- 性能优化:使用占位符延迟字符串构建
- 格式定制:自定义日志格式(时间戳、线程ID等)
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |