Going my way

いいなと思ったことをメモしていきます。

System.out.printlnはなぜインスタンス化せずに使えるのか。


Advertisements


Javaプログラマーなら例外なく誰もが使うのが

System.out.println("hoge");

です。

呼吸をするように、ごく自然に使ってきたから、普段は疑問に思うこともなかったのですが、
小便をしているときにふと、こんな疑問が浮かびました。


なんで、System.out.printlnはインスタンス化しなくても使えてるんだ?

てか、この「out.println」の意味はなんだろう?




Javaでは、

import java.lang.*

は暗黙的に行われます。

なので、java.langパッケージの中にあるSystemクラスのうち、staticで宣言されているメソッドはインスタンス化せずとも使えます。

Systemクラスの中を見てみると、PrintStream型のoutが宣言されています。

package java.lang;
public final class System {
	public final static PrintStream out = nullPrintStream();
}

では、PrintStreamクラスの中を見てみると、printlnメソッドはこのように使われています。

    public void println(String x) {
	synchronized (this) {
	    print(x);
	    newLine();
	}
    }

つまり、System.out.printlnとは、

暗黙的にimportされたjava.lang.Systemクラスの、
outが参照するPrintStreamオブジェクトの、
printlnメソッドを使って引数のStringオブジェクトを書き出している。

ということですね。


toStringって何に使うの?
これも生のソースを見たらわかりやすいですが、
Stringクラスのオブジェクトをそのまま返すメソッドですね。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
    public String toString() {
	return this;
    }
}

例えば、
String s = "hoge"
System.out.println(s.toString());

とすると、「hoge」と出力されます。



エスケープシーケンス一覧

\n 改行(LF)
\t タブ
\r 改行(CR)
\\ バックスラッシュ
\' シングルクォート
\" ダブルクォート