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

API・ライブラリ

Javaの System.out.println() および System.out.print() メソッドについて解説します。
どちらも引数を画面に出力する役割があります。ただし微妙な違いがあり、一言で表すなら

改行するかしないか

です。

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

System.err.println() および System.err.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(表示したい内容);

printlnprint 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]

内部で自動的に 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 という文字列が表示されます。

コード
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);
    }
}
コンパイル結果(抜粋)
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 を代入することで解決できます。または、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オブジェクト指向の理から逸脱した、特異な存在だと言えるでしょう。

自作クラスの文字列表現

この項の理解には、オブジェクト指向プログラミング(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

まとめ

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

本格的な出力には適しませんが、開発では非常によく使うメソッドです。初学者が最初に触れるメソッドでありながら、案外奥深いところもあります。是非使いこなせるようになりましょう!

本記事は今後、より内容を充実させる予定です。

コメント

PAGE TOP
タイトルとURLをコピーしました