Javaの System.out.println()
および System.out.print()
メソッドについて解説します。
どちらも引数を画面に出力する役割があります。ただし微妙な違いがあり、一言で表すなら
改行するかしないか
です。
基本情報
System.out.println()
- 種類:インスタンスメソッド
- 所属クラス:
java.io.PrintStream
- 修飾子:
public
- 引数:なし・すべての基本型・すべての参照型
- 戻り値:なし
- 処理内容:引数を文字列として標準出力
out
に出力し、末尾に改行を付加する - APIリファレンス:PrintStream (Java SE 21 & JDK 21)
System.out.print()
- 種類:インスタンスメソッド
- 所属クラス:
java.io.PrintStream
- 修飾子:
public
- 引数:すべての基本型・すべての参照型
- 戻り値:なし
- 処理内容:引数を文字列として標準出力
out
に出力する - APIリファレンス:PrintStream (Java SE 21 & JDK 21)
基本的な使い方:println()
基本的な構文は以下の通りです。
System.out.println(表示したい内容);
println
は print line
の略だと思われ、実行するたびに自動で改行するという特徴を持ちます。そのため、結果は縦に積み重なる(1行ごとに表示される)ように見えます。
例を見ていきましょう。
基本型を表示する
基本型リテラルをそのまま表示することができます。
- コード
-
public class Main { public static void main(String[] args) { System.out.println(10); // int型 System.out.println(100L); // long型 System.out.println(10.245f); // float型 System.out.println(3.1415926535) // double型 System.out.println(true); // boolean型 System.out.println('魁'); // char型 } }
- 実行結果
-
10 100 10.254 3.1415926535 true 魁
変数の内容を表示する
変数の内容をそのまま表示することができます。
- コード
-
public class Main { public static void main(String[] args) { int a = 10; int b = 20; long c = 10000000L; double d = 33.333; System.out.println(a); // 変数のまま渡す System.out.println(b); System.out.println(c); System.out.println(d); } }
- 実行結果
-
10 20 10000000 33.333
式の結果を表示する
式の結果を表示することができます。
まず、()
内の式が評価され、その結果が表示される仕組みです。
- コード
-
public class Main { public static void main(String[] args) { int a = 100; int b = 10000; System.out.println(10 + 20); System.out.println(100.0 + 30); System.out.println(a - b); // 100 - 10000 } }
- 実行結果
-
30 130.0 -9900
System.out.println(10 + 20)
は、まず式 10 + 20
が評価され、30
になります。その後、System.out.println(30)
が実行され、30
が表示されます。
文字列を表示する
文字列を表示することができます。
- コード
-
public class Main { public static void main(String[] args) { String message = "Hello, Jakarta!"; System.out.println("Hello, Java!"); System.out.println("Hello" + ", " + "Jaka!"); // 文字列結合演算子の利用 System.out.println(message); } }
- 実行結果
-
Hello, Java! Hello, Jaka! Hello, Jakarta!
Main.java
7行目の +
演算子は加算演算子ではなく文字列結合演算子といい、文字列同士を結合するはたらきがあります。
"Hello" + ", " + "Jaka!"
は、まず "Hello" + ", "
が評価されて "Hello, "
になり、その後 "Hello, " + "Jaka!"
が評価されて "Hello, Jaka!"
になります。
なお、エスケープシーケンスが含まれた文字列を扱うこともできます。エスケープシーケンスについて、詳しくはこちらをご覧ください。
参照型を表示する
参照型(インスタンス)の文字列表現を表示することができます。
- コード
-
import java.time.ZonedDateTime; public class Main { public static void main(String[] args) { ZonedDateTime currentTime = ZonedDateTime.now(); // 現在時刻を得る System.out.println(currentTime); } }
- 実行結果(環境により異なる)
-
2025-08-09T17:52:05.284673300+09:00[Asia/Tokyo]
空行を挿入する
引数を与えず、他の println()
と組み合わせて使うことで、空行を挿入することができます。
- コード
-
public class Main { public static void main(String[] args) { System.out.println("Hello, World!"); System.out.println(); // 空行の挿入 System.out.println("Hello, Java!"); } }
- 実行結果
-
Hello, World! Hello, Java!
println()
ではなく、print()
や printf()
と組み合わせている場合は、必ずしもこのような挙動になりません。注意してください。
基本的な使い方:print()
基本的な構文は以下の通りです。
System.out.print(表示したい内容);
println()
とほぼ同じですが、自動で改行しないという特徴があるため、結果は横一列に並ぶように見えます。
例えば、こちらのコードを print()
で書き直すと、以下のようになります。
- コード
-
public class Main { public static void main(String[] args) { int a = 10; int b = 20; long c = 10000000L; double d = 33.333; System.out.print(a); System.out.print(b); System.out.print(c); System.out.print(d); } }
- 実行結果
-
10201000000033.333
改行されず、横一列に並んでいるのが確認できます。
また、引数を与えずに使うことはできません。以下のコードはコンパイルエラーとなります。
- コード
-
public class Main { public static void main(String[] args) { System.out.print("Hello, World!"); System.out.print(); // 問題箇所 System.out.print("Hello, Java!"); } }
- コンパイル結果(抜粋)
APIリファレンスにも、引数をとらない print()
は定義されていません。注意しましょう。
よくある間違い
引数の複数指定
println()
および print()
に引数を複数渡すことはできません。
以下のコードはコンパイルエラーとなります。
- コード
-
public class Main { public static void main(String[] args) { String arg1 = "引数1"; String arg2 = "引数2"; String arg3 = "引数3"; System.out.println(arg1, arg2, arg3); // 引数の複数指定 System.out.print("引数4", "引数5", "引数6"); } }
- コンパイル結果(抜粋)
可変長引数(複数の引数を渡せる機能)がサポートされていないため、このようなエラーが発生します。一度に複数の値を表示したいなら、文字列結合演算子によって要素を結合する必要があります。
- コード
-
public class Main { public static void main(String[] args) { String arg1 = "引数1"; String arg2 = "引数2"; String arg3 = "引数3"; System.out.println(arg1 + ", " + arg2 + ", " + arg3); System.out.print("引数4" + ", " + "引数5" + ", " + "引数6"); } }
- 実行結果
-
引数1, 引数2, 引数3 引数4, 引数5, 引数6
文字列結合演算子によって、"引数4" + ", " + "引数5" + ", " + "引数6"
は "引数4, 引数5, 引数6"
というひとつの文字列になるため、エラーになりません。
改行の重複
println()
は自動で改行するため、誤って手動で改行すると予期せぬ結果になります。
- コード
-
public class Main { public static void main(String[] args) { System.out.println("Hello, Java!"); System.out.printf("%n"); // 手動で改行する命令 System.out.println("Hello, me!"); } }
- 実行結果
-
Hello, Java! Hello, me!
print()
は自動で改行しないため手動での改行が必要ですが、println()
では不要です。
両者を混同しないように注意しましょう。
勘の鋭い人は、上記のコードとこちらのコードが非常に似ていると感じたかもしれません。
実はその通りで、空行は改行の重複によって実現しています。
null時の挙動
println()
および print()
に null
である変数を渡しても NullPointerException
例外は発生せず、代わりに null
という文字列が表示されます。
- コード
-
import java.time.ZonedDateTime; public class Main { public static void main(String[] args) { ZonedDateTime currentTime = null; String yourName = null; System.out.println(currentTime); System.out.print(yourName); } }
- 実行結果
-
null null
ここで重要なのは、このような挙動になるのは型が確定した状態で null
を渡した時のみということです。直に null
を渡すとコンパイルエラーとなります。
- コード
-
public class Main { public static void main(String[] args) { System.out.println(null); System.out.print(null); } }
- コンパイル結果(抜粋)
これはオーバーロード解決の失敗によって発生します。
APIリファレンスを見ると、println()
および print()
には char[]
型の引数をとるものと String
型の引数をとるものがオーバーロード定義されています。
null
は任意の参照型に代入可能なため、char[]
と String
のどちらにも適合します。その結果、どちらの型を引数にとるメソッドを使うべきなのかが曖昧になり、エラーが発生します。これをオーバーロード解決の失敗といいます。
このエラーを解決するためには、null
の型を確定させる必要があります。変数は必ず型を持つため、先ほどの例のように変数に null
を代入することで解決できます。または、null
を明示的にキャストすることでも解決できます。
- コード
-
public class Main { public static void main(String[] args) { // 明示的なキャスト // 型の曖昧さを解消する System.out.println((String) null); System.out.print((Object) null); } }
- 実行結果
-
null null
この複雑な挙動は null
が持つ特殊な性質によって発生します。頭の片隅に入れておくとよいでしょう。
null
は何者かJava言語仕様によれば、null
は「null 型」という型の唯一のリテラルとされています。
しかし、開発者が「null 型」を直接扱うことはできず、Null x = null;
のような構文も存在しません。さらに、すべての参照型変数に代入可能でもあります。
したがって、null
はオブジェクト指向の理から逸脱した、特異な存在だと言えるでしょう。
自作クラスの文字列表現
println()
および print()
で自作クラスのインスタンスの文字列表現を正しく表示するためには、toString()
のオーバーライドが必要です。
オーバーライドしていない状態では Object
クラスの実装がそのまま使われるため、クラス名@ハッシュコード
という形式になります。
- コード
-
class Hero { String name; int hp; int mp; Hero(String name) { this.name = name; hp = 100; mp = 50; } } public class Main { public static void main(String[] args) { Hero h = new Hero("池田"); System.out.println(h); System.out.print(new Hero("田中")); } }
- 実行結果(環境により異なる)
-
Hero@4e50df2e Hero@1d81eb93
適切に toString()
をオーバーライドすることで、意図する文字列表現を表示することができます。
- コード
-
class Hero { String name; int hp; int mp; Hero(String name) { this.name = name; hp = 100; mp = 50; } // toString() のオーバーライド @Override public String toString() { return "name: " + name + ", hp: " + hp + ", mp: " + mp; } } public class Main { public static void main(String[] args) { Hero h = new Hero("池田"); System.out.println(h); System.out.print(new Hero("田中")); } }
- 実行結果
-
name: 池田, hp: 100, mp: 50 name: 田中, hp: 100, mp: 50
まとめ
今回はJavaの System.out.println()
および System.out.print()
メソッドについて解説しました。
本格的な出力には適しませんが、開発では非常によく使うメソッドです。初学者が最初に触れるメソッドでありながら、案外奥深いところもあります。是非使いこなせるようになりましょう!
コメント