手を動かして学ぶ Java入門 (静的メソッド)
環境構築不要! ブラウザから直接コードを実行できます。
本記事では、クラスの静的メソッド (staticメソッド) について学びます。
10分くらいで、さくっと終わる記事をめざしています。
シリーズ一覧
- シリーズ
- 手を動かして学ぶ Java入門 (Hello world 編)
- 手を動かして学ぶ Java入門 (数値と演算)
- 手を動かして学ぶ Java入門 (数値と変数)
- 手を動かして学ぶ Java入門 (コメントの書き方)
- 手を動かして学ぶ Java入門 (文と式の違い)
- 手を動かして学ぶ Java入門 (if文)
- 手を動かして学ぶ Java入門 (if-else文、if-elseif文)
- 手を動かして学ぶ Java入門 (文字列の連結)
- 手を動かして学ぶ Java入門 (while文)
- 手を動かして学ぶ Java入門 (break文)
- 手を動かして学ぶ Java入門 (continue文)
- 手を動かして学ぶ Java入門 (for文)
- 手を動かして学ぶ Java入門 (クラスの超基本)
- 手を動かして学ぶ Java入門 (クラス・メソッド)
- 手を動かして学ぶ Java入門 (クラス・フィールド)
- 手を動かして学ぶ Java入門 (クラス・コンストラクタ)
- 手を動かして学ぶ Java入門 (文字列クラス)
- 手を動かして学ぶ Java入門 (静的メソッド)
- 手を動かして学ぶ Java入門 (静的フィールド)
- 手を動かして学ぶ Java入門 (定数の定義)
- 手を動かして学ぶ Java入門 (クラス継承の超基本)
- 手を動かして学ぶ Java入門 (メソッドのオーバーライド)
- 手を動かして学ぶ Java入門 (メソッドのオーバーロード)
続きは近日公開予定!
はじめに
この記事は paiza.IO の「Online Java compiler」を利用しています。
2024/12/17 現在、上記環境の Java バージョンは 18 です。(paiza.IO利用ガイド)
実行したコードは paiza.IO で保存および公開されることがあります。
そのため、個人情報などの機密性の高い情報は、コードとして入力しないようにご注意ください。
詳細は paiza.IO の利用規約およびプライバシーポリシーをご確認ください。
メソッドのおさらい
メソッドとは、プログラムの実際の処理をまとめたものです。
例えば、足し算や引き算などの計算をしたり、その結果を画面に出力したり、などなどです。
以前の記事 でも学習しましたね。
次の例では、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();
^^^ <--- カッコ
フィールドが使えない
フィールドとは、クラスの インスタンス が持つ変数のことです。
(フィールドについては 以前の記事 で解説しています。不安なかたは、ぜひそちらもご参照ください)
そんなフィールドですが、インスタンスが不要な静的メソッドからは使えません。
まずは、通常のメソッドの例から見てみましょう。
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入門 (静的フィールド)」になります。
関連記事
- シリーズ
- 手を動かして学ぶ Java入門 (Hello world 編)
- 手を動かして学ぶ Java入門 (数値と演算)
- 手を動かして学ぶ Java入門 (数値と変数)
- 手を動かして学ぶ Java入門 (コメントの書き方)
- 手を動かして学ぶ Java入門 (文と式の違い)
- 手を動かして学ぶ Java入門 (if文)
- 手を動かして学ぶ Java入門 (if-else文、if-elseif文)
- 手を動かして学ぶ Java入門 (文字列の連結)
- 手を動かして学ぶ Java入門 (while文)
- 手を動かして学ぶ Java入門 (break文)
- 手を動かして学ぶ Java入門 (continue文)
- 手を動かして学ぶ Java入門 (for文)
- 手を動かして学ぶ Java入門 (クラスの超基本)
- 手を動かして学ぶ Java入門 (クラス・メソッド)
- 手を動かして学ぶ Java入門 (クラス・フィールド)
- 手を動かして学ぶ Java入門 (クラス・コンストラクタ)
- 手を動かして学ぶ Java入門 (文字列クラス)
- 手を動かして学ぶ Java入門 (静的メソッド)
- 手を動かして学ぶ Java入門 (静的フィールド)
- 手を動かして学ぶ Java入門 (定数の定義)
- 手を動かして学ぶ Java入門 (クラス継承の超基本)
- 手を動かして学ぶ Java入門 (メソッドのオーバーライド)
- 手を動かして学ぶ Java入門 (メソッドのオーバーロード)