Java out.println() how is this possible?
Solution 1
static imports do the trick:
import static java.lang.System.out;
or alternatively import every static method and field using
import static java.lang.System.*;
Addendum by @Steve C: note that @sfussenegger said this in a comment on my Answer.
"Using such a static import of System.out isn't suited for more than simple run-once code."
So please don't imagine that he (or I) think that this solution is Good Practice.
Solution 2
PrintStream out = System.out;
out.println( "hello" );
Solution 3
@sfussenegger's answer explains how to make this work. But I'd say don't do it!
Experienced Java programmers use, and expect to see
System.out.println(...);
and not
out.println(...);
A static import of System.out or System.err is (IMO) bad style because:
- it breaks the accepted idiom, and
- it makes it harder to track down unwanted trace prints that were added during testing and not removed.
If you find yourself doing lots of output to System.out or System.err, I think it is a better to abstract the streams into attributes, local variables or methods. This will make your application or library more maintainable and more reusable.
(Obviously, if your Java program is a once-off thing that you intend to throw away when you have completed the current task, then maintainability is not a concern. But the flip side is that "throw away" code is often NOT thrown away.)
Solution 4
Well, you would typically use
System.out.println("print something");
which doesn't require any imports. However, since out is a static field inside of System, you could write use a static import like this:
import static java.lang.System.*;
class Test {
public static void main(String[] args) {
out.println("print something");
}
}
Take a look at this link. Typically you would only do this if you are using a lot of static methods from a particular class, like I use it all the time for junit asserts, and easymock.
Solution 5
out
is a PrintStream
type of static variable(object) of System
class and println()
is function of the PrintStream
class.
class PrintStream
{
public void println(){} //member function
...
}
class System
{
public static final PrintStream out; //data member
...
}
That is why the static variable(object) out
is accessed with the class name System
which further invokes the method println()
of it's type PrintStream
(which is a class).
user69514
Updated on July 09, 2022Comments
-
user69514 almost 2 years
I've seen some code such as:
out.println("print something");
I tried
import java.lang.System;
but it's not working. How do you use
out.println()
? -
sfussenegger over 14 years
out
isn't a method, it's a field. -
sfussenegger over 14 yearsand now you don't "create" an object :)
-
Oskar Kjellin over 14 yearsThe official java documentation uses the term "Create object" aswell as the one i guess you are referring to "instantiate" java.sun.com/docs/books/tutorial/java/javaOO/…
-
sfussenegger over 14 yearsYou don't create or instantiate an object at all. You simply copy the reference. Hence
System.out
andout
will reference the same object, i.e.System.out == out
will betrue
-
hhafez over 14 yearswith most ide's these days it will fix it up for you anyway, in eclipse do an organise imports and it will change your java.lang.System.*; to java.lang.System.out; for you (assuming you are only using out)
-
Casey over 14 yearsdoh! Thanks for catching that. I meant to say field.
-
Oskar Kjellin over 14 yearsoh, missed your "now" part :P By the way I haven't programmed java that much as you might notice
-
sfussenegger over 14 yearsI agree a missing "System." might be confusing at first look. Using local variables or attributes doesn't really change anything though, does it? Using a local
protected void println(Object o) { System.out.println(o);}
might be a good idea though as the output destination could easily be changed, say tolog.info(o)
for instance. -
Stephen C over 14 years@sfussenegger - use of a local variable or an attribute does make it easier to change the destination than using System.out all over the place ... whether System.out is imported or not.
-
sfussenegger over 14 yearsokay, that's true. But it's also possible to replace a static import of System.out by a field called out - no need to assign System.out to out. But generally, I agree with you. Using such a static import of System.out isn't suited for more than simple run-once code.