覆盖System.out.println方法

5

如何重写 System.out.println() ?

就像我会重写 toString() 一样;

@Override
public String toString() {
    return "x";
}

我想让这样做:当您调用

System.out.println(OBJECT);

它将打印对象的属性而不是引用。

如果你在对象的类中覆盖了 toString 方法,那么它将打印出你想要的任何内容。 - kaya3
对象的哪个属性?不同的对象将具有不同的“属性”。你是指要打印每个对象的toString()方法吗? - sleepToken
此外,重写 toString 方法和 System.out.println() 并不会得到相同的结果。它们是两种不同的方法。 - Nicolas
2个回答

10

严格来说,回答你的问题 "如何覆盖System.out.println()?" 的答案是您可以使用System.setOut用其他PrintStream替换System.out。您提供的PrintStream可以按照您喜欢的方式实现println (*)。

但这几乎肯定不是你的意思。您可以代替在类上覆盖toString()方法,然后将其用于所有希望构建实例字符串表示的位置,而不仅仅是System.out.println


(*) 但是,如果您想符合规范,您的灵活性不是很大,例如println(Object) "调用String.valueOf(x)"。


3

覆盖System.out.println不是你需要的。要做到这一点,你需要扩展PrintStream并覆盖printLn方法的所有重载版本,然后需要通过调用System.setOut()来替换JVM的标准流。

每个Java对象都具有将自身转换为字符串表示形式的能力。为了“定制”此表示形式,您需要覆盖toString()方法。

无论对象的类别如何,printLn始终会独立地调用toString()。这就是我们所说的多态。

因此,为想要特殊字符串表示形式的每个类覆盖toString()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接