为什么在导入java.io.PrintStream类后不能直接使用print()或println()方法?

5
抱歉问一个愚蠢的问题,当我在学习Java类时,尝试了以下操作:
javap -c java.lang.System | grep -i out
  public static final java.io.PrintStream out;
javap java.io.PrintStream | grep print public void print(boolean); public void print(char); public void print(int); public void print(long); public void print(float); public void print(double); public void print(char[]); public void print(java.lang.String); public void print(java.lang.Object); public void println(); public void println(boolean); public void println(char); public void println(int); public void println(long); public void println(float); public void println(double); public void println(char[]); public void println(java.lang.String); public void println(java.lang.Object); public java.io.PrintStream printf(java.lang.String, java.lang.Object...); public java.io.PrintStream printf(java.util.Locale, java.lang.String, java.lang.Object...);
我想看一下是否可以导入java.io.PrintStream并直接使用print()println()而不是System.out.println()
import java.io.PrintStream;
println('a');

出现了编译错误,提示如下:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method print(char) is undefined for the type array
    at array.main(array.java:16)

即使导入了java.io.Printstream,为什么我还不能直接使用println()


3
因为你需要一个PrintStream对象来调用它。 - user207421
1
你能做到的最接近的是 import static System.out;,这让你可以使用 out.println()。不过,它只能省下 7 个字符,而且大多数 IDE 都有一个自动完成功能,支持 sysout,所以做这个并没有太大的价值。 - JonK
4个回答

10

由于printlnPrintStream类的实例方法,您需要类的一个实例来调用实例方法。

但是,System.outPrintStream的一个实例,因此您可以这样做:

 System.out.println("blah blah")

或者您可以创建一个新的PrintStream实例,例如用于写入文件:

 PrintStream p = new PrintStream(filename);
 p.println("blah blah");

Java教程中的这一部分可能会很有帮助:Lesson: Classes and Objects


1
谢谢您指出教程。很有道理。 - nohup

1
你需要一个 PrintStream 的实例,因为 println 不是静态的。
你可以尝试这样做:
import java.io.PrintStream;
PrintStream printStream = new PrintStream(System.out);
// or better
PrintStream printStream = System.out;
printStream.println('a');

PrintStream构造函数需要一个OutputStream参数,你可以提供你想要的OutputStream:
ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream
Javadoc: OutputStream PrintStream

2
System.out 已经是一个 PrintStream。为什么要创建第二个 PrintStream 来包装它呢? - Grodriguez
你说得对。这是创建PrintStream并使用它的println方法以与Sysout相同效果的最简单方式。PO说:“直接使用print()或println(),而不是System.out.println()。” PrintStream printStream = System.out; 也是一个解决方案(顺便说一句,更好看)。 - David Kühner

0
在Java中,您总是需要在特定对象上调用方法(函数)。 这就是为什么如果您想调用任何这些方法(print,println),您需要首先创建类型为java.io.PrintStream的对象。
例如,请尝试以下代码:
import java.io.PrintStream;
...
PrintStream ps = System.out;
ps.print('a');

它创建了一个PrintStream对象,该对象打印到控制台并在那里打印给定的字符参数。

应该是 PrintStream ps = System.out - Thanigai Arasu
是的,我知道。只是想以这种方式来展示作者为什么代码无法工作(出于教育目的)。因为问题实际上并不是关于流,而是关于对象创建过程和方法调用方式的。 - dany-freezee
但是告诉 OP 创建一个额外的实例,当他不需要时,这不是误导吗? - Grodriguez
好的,你说的这样做更好。但是考虑到提出的问题类型和有关刚学习Java的评论,我认为为教育目的显式地展示创建对象的过程很重要。 - dany-freezee

0
你需要实例化PrintStream类,但它没有默认的无参构造函数。
因此,可以通过从System类使用其静态实例并直接调用print()方法来简单地使用它。

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