静的メソッド
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 16/87。
静的変数がインスタンスではなくクラスに属するのと同様に、静的メソッドもクラス自体に属します。オブジェクトを作成せずに呼び出すことができます。
static キーワードを追加することで、静的メソッドを宣言します。
public class MathHelper {
public static int add(int a, int b) {
return a + b;
}
public static int multiply(int a, int b) {
return a * b;
}
}
// オブジェクトを作成せずに呼び出す
int sum = MathHelper.add(5, 3); // 8
int product = MathHelper.multiply(4, 2); // 8静的メソッドには1つの重要な制限があります。それは、インスタンス変数やインスタンスメソッドに直接アクセスできないということです。静적メソッドはオブジェクトなしで存在するため、操作するための this 参照が存在しません。
public class Counter {
private int count; // インスタンス変数
private static int total; // 静的変数
public static void incrementTotal() {
total++; // OK - 静的変数へのアクセス
// count++; // エラー!インスタンス変数にはアクセスできません
}
}静的メソッドは、オブジェクトの状態に依存しないユーティリティ操作に最適です。Math.sqrt() や Integer.parseInt() のようなメソッドを思い浮かべてください。これらは、個々のオブジェクトに対してではなく、クラスレベルで意味を成す機能を提供します。
チャレンジ
簡単オブジェクトを作成することなく、便利な文字列操作メソッドを提供する StringUtils ユーティリティクラスを作成しましょう。これは静的メソッド(static methods)のデモンストレーションに最適です!
コードを整理するために、2つのファイルを作成します:
StringUtils.java: 一般的な文字列操作を実行する静的メソッドを持つユーティリティクラスを作成します:- 与えられた文字列内の母音(a, e, i, o, u - 大文字と小文字の両方)の数を返す静的メソッド
countVowels(String text) - 文字列を反転させて返す静的メソッド
reverse(String text) - 文字列が前から読んでも後ろから読んでも同じ(大文字・小文字を区別しない)場合に
trueを返し、そうでない場合にfalseを返す静的メソッドisPalindrome(String text)
- 与えられた文字列内の母音(a, e, i, o, u - 大文字と小文字の両方)の数を返す静的メソッド
Main.java: ユーティリティクラスを使用して文字列を処理します。1つの入力(テキスト文字列)を受け取ります。クラス名を介して各静的メソッドを直接呼び出し、次の3行を出力してください:Vowels: [count]Reversed: [reversed string]Palindrome: trueまたはPalindrome: false
分析対象となる1つの入力(テキスト文字列)を受け取ります。
静的メソッドは、インスタンスを最初に作成するのではなく、クラス名を使用して呼び出される(例:StringUtils.countVowels(text))ことを忘れないでください。これにより、呼び出し間で状態を保持する必要のない操作において、ユーティリティクラスは非常に便利になります。
チートシート
静的メソッドはクラス自体に属し、オブジェクトを作成せずに呼び出すことができます。staticキーワードを使用して宣言します:
public class MathHelper {
public static int add(int a, int b) {
return a + b;
}
}
// オブジェクトを作成せずに呼び出す
int sum = MathHelper.add(5, 3); // 8重要な制限事項: 静的メソッドは、オブジェクトなしで存在し、this参照を持たないため、インスタンス変数やインスタンスメソッドに直接アクセスすることはできません:
public class Counter {
private int count; // インスタンス変数
private static int total; // 静的変数
public static void incrementTotal() {
total++; // OK - 静的変数へのアクセス
// count++; // エラー!インスタンス変数にはアクセスできません
}
}静的メソッドは、Math.sqrt()やInteger.parseInt()のように、オブジェクトの状態に依存しないユーティリティ操作に最適です。
自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String text = scanner.nextLine();
// TODO: StringUtils の static メソッドを使用してテキストを分析する
// 母音の数を取得するために StringUtils.countVowels(text) を呼び出す
// 反転した文字列を取得するために StringUtils.reverse(text) を呼び出す
// 回文かどうかを確認するために StringUtils.isPalindrome(text) を呼び出す
// TODO: 次の形式で結果を出力する:
// Vowels: [count]
// Reversed: [reversed string]
// Palindrome: true/false
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造