Javaの静的メソッドと非静的メソッドの違いを徹底解説
Javaのメソッドとは、特定の操作を実行するためにひとまとめにされた一連のステートメントの集合です。たとえばSystem.out.println()メソッドを呼び出す際、システム内部では実際に複数のステートメントが順番に実行され、コンソールへメッセージが表示されています。
静的メソッド(Static Method)とは
静的メソッドは「クラスメソッド」とも呼ばれ、そのクラスのすべてのオブジェクト間で共有されるメソッドです。最大の特徴は、インスタンスを生成しなくてもクラス名を指定するだけで直接呼び出せる点にあります。
非静的メソッド(Non-Static Method)とは
クラス内でstaticキーワードが付与されていないメソッドは、非静的メソッド(インスタンスメソッド)と呼ばれます。このメソッドを呼び出すには、あらかじめクラスのインスタンス(オブジェクト)を生成しておく必要があります。
以下の表は、静的メソッドと非静的メソッドの主な違いを整理したものです。
| No. | 項目 | 静的メソッド | 非静的メソッド |
|---|---|---|---|
| 1 | アクセス範囲 | 静的メンバーにのみアクセス可能。非静的メンバーにはアクセスできない。 | 静的メンバー・非静的メンバーの両方にアクセス可能。 |
| 2 | バインディング | コンパイル時バインディング(早期バインディング)を採用。 | 実行時バインディング(動的バインディング)を採用。 |
| 3 | オーバーライド | コンパイル時に結合が確定するため、オーバーライド不可。 | 実行時に結合が決まるため、オーバーライド可能。 |
| 4 | メモリ割り当て | 占有領域が小さく、メモリ割り当ては一度だけ行われる。 | 比較的多くの領域を消費する場合がある。メソッド呼び出し時にメモリが割り当てられ、実行完了後に解放される。 |
| 5 | キーワード | 宣言時にstaticキーワードが必要。 | 特別なキーワードは不要。 |
静的メソッドと非静的メソッドのコード例
JavaTester.java
public class JavaTester {
public static void main(String args[]) {
// 静的メソッドはクラス名で直接呼び出せる
Tiger.roar();
// 非静的メソッドはインスタンス生成後に呼び出す
Tiger tiger = new Tiger();
tiger.eat();
}
}
class Tiger {
public void eat(){
System.out.println("Tiger eats");
}
public static void roar(){
System.out.println("Tiger roars");
}
}
実行結果
Tiger roars Tiger eats
使い分けのポイント
ユーティリティ的な処理や、インスタンスの状態に依存しない共通処理は、静的メソッドとして定義するとシンプルで効率的です。一方、オブジェクトごとの状態(フィールド)を読み書きする処理は、非静的メソッドとして定義するのが適切です。両者の特性を理解し、場面に応じて正しく使い分けることが、保守性の高いJavaコードを書く第一歩となります。
-
Javaのpaint()メソッドとrepaint()メソッドの違いをわかりやすく解説
JavaでGUIアプリケーションを開発する際、コンポーネントの描画に関わるpaint()メソッドとrepaint()メソッドは、役割がまったく異なる重要なメソッドです。この記事では、両者の違いと正しい使い方を具体例とともに解説します。 paint()メソッドとrepaint()メソッドの違い paint()メソッドとは paint()は、コンポーネントを実際に描画するための処理(描画命令)を記述するメソッドです。Java AWTでは、このメソッドをオーバーライドして独自の描画処理を実装します。 一方、Java SwingではpaintComponent()メソッドをオーバーライドするのが推奨さ
-
Javaにおける静的バインディングと動的バインディングの違いを徹底解説
静的バインディングと動的バインディングとは?Javaでは、メソッド呼び出しと実際の処理内容を結び付ける(バインドする)タイミングによって、「静的バインディング」と「動的バインディング」の2種類に分けられます。この仕組みを理解することは、ポリモーフィズム(多態性)や継承を正しく扱う上で非常に重要です。静的バインディング(早期バインディング)コンパイルの時点で、どのメソッドや変数が使用されるかが確定できる場合、コンパイラは参照を静的に結び付けます。これが静的バインディングです。具体的には、以下のような要素が静的バインディングの対象となります。static変数・staticメソッド:クラスレベルで管