System.out.printlnはなぜインスタンス化せずに使えるのか。
Advertisements
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) \\ バックスラッシュ \' シングルクォート \" ダブルクォート