JavaのSystem.out.println()およびSystem.out.print() メソッドについて解説します。
System.err.println() および System.err.print() は解説していません。
記事内のコードは OpenJDK 21 で動作確認済みです。
基本情報
println() と print() の違い
結論から言えば、改行するかどうかです。
どちらも「引数に与えられた内容を表示する」点では変わりませんが、System.out.println() は1命令ごとに改行するのに対し、System.out.print() は改行しません。
println() の簡単な例
public class Main {
public static void main(String[] args) {
System.out.println("Hello"); // 1
System.out.println("World"); // 2
System.out.println("!"); // 3
}
}Hello
World
!

print() の簡単な例
public class Main {
public static void main(String[] args) {
System.out.print("Hello"); // 1
System.out.print("World"); // 2
System.out.print("!"); // 3
}
}HelloWorld!
基本的な使い方:println()
基本的な構文は次の通りです。
System.out.println(表示したい内容);
println は print line の略だと思われ、1命令ごとに自動で改行する特徴を持ちます。そのため、結果は縦に積み重なる(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.141592) // double
System.out.println(true); // boolean
System.out.println('魁'); // char
}
}10
100
10.254
3.141592
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!" になります。
エスケープシーケンスが含まれた文字列を扱うこともできます。
参照型を表示する
参照型(インスタンス)の文字列表現を表示できます。
public class Main {
public static void main(String[] args) {
ZonedDateTime currentTime = ZonedDateTime.now(); // 現在時刻を得る
System.out.println(currentTime);
}
}2026-02-17T17:52:05.284673300+09:00[Asia/Tokyo]
内部で自動的に toString() が呼び出されるため、currentTime.toString() と書くのは冗長です。
空行を挿入する
引数を与えず、他の 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() と同じであるため、説明は省略します。
引数なしでは使えない=空行を挿入する用途には使えない点にだけ注意しましょう。
よくある間違い
引数の複数指定
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" というひとつの文字列になるため、エラーになりません。
printf() は可変長引数をサポートしているため、条件を満たせばいくつでも引数を渡すことができます。
改行の重複
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() では不要です。
両者を混同しないように注意しましょう。
printf() も自動で改行しません。
null時の動作
この項の理解には、オブジェクト指向プログラミング(OOP)に関する基本的な理解と習熟が必要です。
println() および print() に null である変数を渡しても NullPointerException 例外は発生せず、文字列として null が表示されます。
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 を代入することで解決できます。また、明示的にキャストすることでも解決できます。
public class Main {
public static void main(String[] args) {
// 明示的なキャスト
// 型の曖昧さを解消する
System.out.println((String) null);
System.out.print((Object) null);
}
}null
null自作クラスの文字列表現
この項の理解には、オブジェクト指向プログラミング(OOP)に関する基本的な理解と習熟が必要です。
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@1d81eb93toString() を適切にオーバーライドすることで、意図した表示になります。
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