【Java・実例あり】println() と print() の違いと使い方

JavaのSystem.out.println()およびSystem.out.print() メソッドについて解説します。

System.err.println() および System.err.print() は解説していません。

記事内のコードは OpenJDK 21 で動作確認済みです。

基本情報

種類インスタンスメソッド
所属クラスjava.io.PrintStream
修飾子public
引数なし・すべての基本型・すべての参照型
戻り値なし
処理内容引数を文字列として標準出力 out に出力し、末尾に改行を付加する
APIリファレンスPrintStream (Java SE 21 & JDK 21)
種類インスタンスメソッド
所属クラスjava.io.PrintStream
修飾子public
引数すべての基本型・すべての参照型
戻り値なし
処理内容引数を文字列として標準出力 out に出力する
APIリファレンスPrintStream (Java SE 21 & JDK 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(表示したい内容);

printlnprint 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!");
    }
}
コンパイル結果(抜粋)
java: no suitable method found for print(no arguments)
    method java.io.PrintStream.print(boolean) is not applicable
      (actual and formal argument lists differ in length)
    method java.io.PrintStream.print(char) is not applicable
      (actual and formal argument lists differ in length)

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");
    }
}
コンパイル結果(抜粋)
java: no suitable method found for println(java.lang.String,java.lang.String,java.lang.String)
    method java.io.PrintStream.println() is not applicable
java: no suitable method found for print(java.lang.String,java.lang.String,java.lang.String)
    method java.io.PrintStream.print(boolean) is not applicable

可変長引数(複数の引数を渡せる機能)がサポートされていないため、このようなエラーが発生します。一度に複数の値を表示したい場合は、文字列結合演算子によって要素を結合する必要があります。

コード
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);
    }
}
コンパイル結果(抜粋)
java: reference to println is ambiguous
  both method println(char[]) in java.io.PrintStream and method println(java.lang.String) in java.io.PrintStream match
java: reference to print is ambiguous
  both method print(char[]) in java.io.PrintStream and method print(java.lang.String) in java.io.PrintStream match

これはオーバーロード解決の失敗によって発生します。

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@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

FAQ

書式指定文字列を利用できるかどうかです。

書式指定文字列は % から始まる特殊な記法(書式指定子)を含む文字列で、高度な文字列の整形ができます。System.out.printf() のほうが柔軟性は高いと言えるでしょう。
ただし、単に文字列を表示したいだけなら System.out.println() または System.out.print() で十分です。

出力先(表示先)が異なります。

System.out 系は標準出力 out に文字列を出力し、System.err 系は標準エラー出力 err に文字列を出力します。
ただし、多くの場合で両者は同じ出力先(同一のコンソールなど)を指します。どちらを使っても結果に変化はないことが多いです。
※ 一部の環境では、両者を区別するために表示順や文字色が変化することがあります。
 out および err の中身(出力先)は後から変更可能です。

基本は System.out.println() をおすすめします。

改行がある方が圧倒的に見やすいためです。自動で改行されるため、特別な操作が不要なのも利点です。
もちろん、System.out.print() が活躍する場面も多くあります。基本は println()で統一し、必要なときだけprint() を使うとよいでしょう。

できます。

ただし、改行位置が分かりにくくなります。

\n (改行命令)を使用します。

System.out.print() は自動で改行しないため、改行命令を手動で文字列に挿入する必要があります。
\n について、詳しくはこちらをご覧ください。

ほぼありません。

System.out.println() は改行を付加する分だけわずかに遅いですが、その差は実用上無視できるレベルです。
もし差が生まれるとすれば、それは両者の性能差ではなく、実行環境に起因する可能性が高いでしょう。

できません。

System.out.println() はつねに環境依存の改行コードを使用します。Windows なら CRLF 、UNIX / Linux / macOS なら LF です。

できます。

System.out は静的変数であり、System.setOut() セッターによって変更可能です。
PrintStream クラスのインスタンスを渡すことができ、この方法で変数 out の内容を変更すれば、出力先を変えることができます。
ただし、変数 out を使うすべての処理に影響するため、注意が必要です。

関連記事