5
votes

Apologies for this silly question, but while I was learning java classes, I tried the following

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...);

And I tried to see if I can import java.io.PrintStream and use print() or println() as it is, instead of System.out.println().

import java.io.PrintStream;
println('a');

And it came out with a compile error saying

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)

Why can't I use println() as it is after importing java.io.Printstream ?

4
Because you need a PrintStream object to call it on.user207421
The closest you can get is import static System.out;, which allows you to do out.println(). That only saves 7 characters though, and given that most IDEs have an autocomplete feature that works on sysout, it's hardly worth doing.JonK

4 Answers

11
votes

Because println is an instance method of the PrintStream class, and you need an instance of a class to call instance methods.

However, System.out is an instance of PrintStream, so you can do:

 System.out.println("blah blah")

or you can create a new PrintStream instance, for example to write to a file:

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

This section in the Java Tutorial can be helpful: Lesson: Classes and Objects

1
votes

You need an instance of PrintStream because println is not static.

You can try this:

import java.io.PrintStream;
PrintStream printStream = new PrintStream(System.out);
// or better
PrintStream printStream = System.out;
printStream.println('a');

PrintStream needs a OutputStream for the constructor, you can give the OutputStream you want:

ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream

Javadoc : OutputStream PrintStream

0
votes

In Java You always need to call a method (function) on a specific object. That's why if you want to call any of these methods (print, println) you need to create the object of type java.io.PrintStream first.

For example, try the following code:

import java.io.PrintStream;
...
PrintStream ps = System.out;
ps.print('a');

It creates the PrintStream object which prints to the cosole and prints the given char argument there.

0
votes

You will have to instantiate PrintStream class but it doesn't have a default no-arg constructor.
So it's an easy way to use its static instance from System class and call the print() method directly.