Java out.println() how is this possible?

255,352

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

Share:
255,352
user69514
Author by

user69514

Updated on July 09, 2022

Comments

  • user69514
    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
    sfussenegger over 14 years
    out isn't a method, it's a field.
  • sfussenegger
    sfussenegger over 14 years
    and now you don't "create" an object :)
  • Oskar Kjellin
    Oskar Kjellin over 14 years
    The 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
    sfussenegger over 14 years
    You don't create or instantiate an object at all. You simply copy the reference. Hence System.out and out will reference the same object, i.e. System.out == out will be true
  • hhafez
    hhafez over 14 years
    with 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
    Casey over 14 years
    doh! Thanks for catching that. I meant to say field.
  • Oskar Kjellin
    Oskar Kjellin over 14 years
    oh, missed your "now" part :P By the way I haven't programmed java that much as you might notice
  • sfussenegger
    sfussenegger over 14 years
    I 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 to log.info(o) for instance.
  • Stephen C
    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
    sfussenegger over 14 years
    okay, 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.