広告

手を動かして学ぶ Java入門 (静的メソッド)

環境構築不要! ブラウザから直接コードを実行できます。
本記事では、クラスの静的メソッド (staticメソッド) について学びます。

10分くらいで、さくっと終わる記事をめざしています。


シリーズ一覧

続きは近日公開予定!

はじめに

この記事は paiza.IO の「Online Java compiler」を利用しています。
2024/11/18 現在、上記環境の Java バージョンは 18 です。(paiza.IO利用ガイド)

実行したコードは paiza.IO で保存および公開されることがあります。
そのため、個人情報などの機密性の高い情報は、コードとして入力しないようにご注意ください。

詳細は paiza.IO の利用規約およびプライバシーポリシーをご確認ください。

メソッドのおさらい

メソッド (method) あるいは メンバー関数 (-かんすう, member function) とはオブジェクト指向プログラミング言語において、あるクラスまたはオブジェクトに所属するサブルーチンを指す。

メソッドとは、プログラムの実際の処理をまとめたものです。
例えば、足し算や引き算などの計算をしたり、その結果を画面に出力したり、などなどです。

以前の記事 でも学習しましたね。

次の例では、Human クラスに say メソッドを宣言しています。

public class Human {
    public void say() {
        System.out.println("こんにちは!");
    }
}

さて、この say メソッドを呼び出すには、どうすればよかったでしょうか…?

Human human = new Human();
human.say();

そう、Human クラスの インスタンス が必要なのでしたね。
インスタンスは new 演算子で生成します。

通常メソッドの呼び出し図

通常のメソッドは、この インスタンス に対して呼び出します。
これが大事なポイントです。

静的メソッド

静的メソッドの呼び出し図

静的メソッドとは、クラス に対して直接呼び出すことのできるメソッドです。
つまり インスタンス は必要ありません。

先ほどの Human クラスを例に見てみましょう。
ただし、1点修正を加えています。

public class Human {
    public static void say() {
        System.out.println("こんにちは!");
    }
}

say メソッドに static というキーワードがついていますね。
static は「静的な」という意味になります。

それでは、静的メソッドを実際に使ってみましょう。
コードは変更せずに、そのまま「実行(Ctrl-Enter)」ボタンを押してください。

注意:コードは2ファイルあります。上部のタブで切り替え可能です。

タブ

(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)

いかがでしたでしょうか? 「出力」のところに

こんにちは!

と表示されたら成功です。

宣言

静的メソッドを宣言するには static キーワードを使います。

  • アクセス修飾子 + static + 戻り値の型 + メソッド名 + カッコ

という順番ですね。

public class Human {
    public static void say() {
           ^^^^^^ <--- この部分!
        ...
    }
}

※ アクセス修飾子の前に static を書くこともできますが、一般的ではないためおすすめしません。

呼び出し

public class Human {
    public static void say() {
        System.out.println("こんにちは!");
    }
}

静的メソッド呼び出しの基本は、

  • クラス名 + ドット + メソッド名 + カッコ

になります。

インスタンス は必要ありません。
クラスに対して直接メソッドを呼び出します。

Human.say();
^^^^^ <--- クラス名
Human.say();
     ^ <--- ドット
Human.say();
      ^^^ <--- メソッド名
Human.say();
      ^^^ <--- カッコ

フィールドが使えない

オブジェクト指向プログラミングでは、フィールドはクラスや構造体などに直接宣言される任意の型の変数であり[3]、オブジェクト内にカプセル化されたデータである。

フィールドとは、クラスの インスタンス が持つ変数のことです。
(フィールドについては 以前の記事 で解説しています。不安なかたは、ぜひそちらもご参照ください)

そんなフィールドですが、インスタンスが不要な静的メソッドからは使えません。

まずは、通常のメソッドの例から見てみましょう。
Human クラスに、name というフィールドを持たせてみます。

そして、name は通常のメソッドである say メソッドで使われます。

public class Human {
    private String name;

    public Human(String n) {
        name = n;
    }

    public void say() {
        System.out.println("私は " + name + " です。");
    }
}

それでは実際にコードを動かしてみましょう。
結果がどうなるか予想してから「実行(Ctrl-Enter)」ボタンを押してください。

注意:コードは2ファイルあります。上部のタブで切り替え可能です。

タブ

(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)

いかがでしたでしょうか? 「出力」のところに

私は アリス です。

と表示されたら成功です。

say メソッドで name フィールドが問題なく使えていますね。

それでは、先ほどの Human クラスの say メソッドを、静的メソッドに書き換えてみましょう。

public class Human {
    ...

    public static void say() {
           ^^^^^^ <--- ここを追加!
        ...
    }
}

結果がどうなるか予想してから「実行(Ctrl-Enter)」ボタンを押してください。

注意:コードは2ファイルあります。上部のタブで切り替え可能です。

タブ

(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)

いかがでしたでしょうか?

Human.java:9: error: non-static variable name cannot be referenced from a static context
        System.out.println("私は " + name + " です。");
                                   ^
1 error

とエラーになれば成功です。

"non-static variable name cannot be referenced from a static context" は意訳すると…

  • static ではないフィールド(変数) は、静的メソッドからはアクセスできません

という感じですね。

補足

  • "non-static variable" とあるように、実は "static variable" … 静的フィールドというものもあります。
    今回は解説しませんが、静的フィールドであれば、静的メソッドからアクセスできます。
    (ただし、静的メソッドのために安易に静的フィールドを使うのはおすすめしません)

メリット

静的メソッドのメリットは

  • インスタンスを生成しない

ということにつきます。

インスタンスを生成するには、多少なりとも 処理に時間 がかかりますし メモリも必要 になります。
塵も積もればなんとやら…

あとは、少しだけコードの記述が簡潔になりますね。

Human human = new Human();
human.say();

↑これが…

Human.say();

↑こう書けます。

ただし、無理に静的メソッドにこだわる必要はないでしょう。
慣れないうちは、

  • フィールドが1つもないクラス

に対してだけ、静的メソッドを使ってみようかな、くらいでよいと思います。


応用問題

【問題】

まずは、下記のプログラムをそのまま「実行(Ctrl-Enter)」してみましょう。
結果はコンパイルエラーになったはずです。

Main.java:4: error: cannot find symbol
        int num1 = Calculator.total(1, 2, 3);

これは、Calculator クラスに total メソッドがないためです。

そこで問題です。

Calculator クラスに、静的メソッドの total を書き加えてください。

public class Calculator {
    // ここに静的メソッドの total を宣言してください。
}

total メソッドの内容は次のようになります。

  • int 型のパラメータを3つ受け取ります
  • その3つのパラメータの合計を戻り値 (int) として返します

例えば、

int num1 = Calculator.total(1, 2, 3);

↑は、1 + 2 + 3 の結果である 6 を返します。

つまり、下のプログラムを実行すると、

int num1 = Calculator.total(1, 2, 3);
System.out.println("num1 = " + num1);

int num2 = Calculator.total(40, 50, 60);
System.out.println("num2 = " + num2);

結果として、

num1 = 6
num2 = 150

と「出力」に表示されるようにします。

それでは、Calculator クラスに total メソッドを書き加えてから「実行(Ctrl-Enter)」してみましょう。

注意:コードは2ファイルあります。上部のタブで切り替え可能です。

タブ

(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)

無事に、

num1 = 6
num2 = 150

と出力されましたでしょうか?

もし解けなかった場合は、下記の回答例をご参照ください。

回答例

【コード】

public class Calculator {
    // ここに静的メソッドの total を宣言してください。
    public static int total(int value1, int value2, int value3) {
        return value1 + value2 + value3;
    }
}

※ Main.java は書き換えません。

【出力】

num1 = 6
num2 = 150

まとめ

本記事では、クラスの静的メソッドについて解説しました。

静的メソッドとは、クラス に対して直接呼び出すことのできるメソッドです。
インスタンスを必要としないので、コードの記述が少し簡潔になる、などのメリットがあります。

有効に活用していきたいですね。

次回は「手を動かして学ぶ Java入門 (静的フィールド)」になります。


関連記事

ページの先頭へ