Javaのstaticメソッド・staticブロックに課される制限とは?基本から徹底解説
staticメソッドとstaticブロックとは
staticメソッドはクラスに属するメソッドであり、クラスがメモリにロードされるときに一緒に読み込まれます。そのため、オブジェクト(インスタンス)を生成しなくても、クラス名を指定するだけで直接呼び出すことができます。
一方、staticブロックは、staticキーワードを付けて記述するコードブロックのことです。主にstatic変数などのstaticメンバーを初期化する目的で使われます。JVMはクラスのロード時点で、mainメソッドよりも先にstaticブロックを実行します。
サンプルコード
public class Sample {
static int num = 50;
static {
System.out.println("Hello this is a static block");
}
public static void demo() {
System.out.println("Contents of the static method");
}
public static void main(String args[]) {
Sample.demo();
}
}
実行結果
Hello this is a static block Contents of the static method
この出力からも分かるように、mainメソッド内でdemo()を呼び出す前に、まずstaticブロックが実行されていることが確認できます。
staticメソッドとstaticブロックの制限
staticメソッドの制限
staticコンテキスト(staticメソッドやstaticブロック)からは、非staticなメンバー(メソッドや変数)にアクセスできません。非staticメンバーはインスタンスごとに存在するためです。
staticコンテキスト内では、thisおよびsuperキーワードを使用できません。これらは特定のオブジェクト(インスタンス)を参照するためのものだからです。
staticメソッドが直接アクセスできるのは、static型のデータ(static変数)のみです。
staticメソッドはオーバーライドできません。サブクラスで同名のstaticメソッドを定義した場合、それはオーバーライドではなく「隠蔽(シャドーイング)」と呼ばれる動作になります。
staticブロックの制限
staticブロックから値を返すことはできません。return文による戻り値の指定は許されていません。
staticブロックを明示的に呼び出すことはできません。実行されるのはクラスがロードされたタイミングのみです。
staticブロック内で例外が発生する可能性がある場合は、必ずtry-catchで囲む必要があります。throwによって例外を外部に投げることはできません。
staticブロック内では、thisおよびsuperキーワードを使用できません。
複数のstaticブロックがある場合、実行順序を動的に制御することはできず、宣言された順番どおりに上から実行されます。
まとめ
staticメンバーはクラスレベルで管理されるため便利な反面、インスタンスに依存する機能(thisやsuperの参照、非staticメンバーへのアクセスなど)には制限があります。特にstaticブロックはクラスロード時に一度だけ自動的に実行されるという特殊な性質を持つため、初期化処理での例外の扱いや実行順序には十分注意して設計しましょう。
-
Javaのpaint()メソッドとrepaint()メソッドの違いをわかりやすく解説
JavaでGUIアプリケーションを開発する際、コンポーネントの描画に関わるpaint()メソッドとrepaint()メソッドは、役割がまったく異なる重要なメソッドです。この記事では、両者の違いと正しい使い方を具体例とともに解説します。 paint()メソッドとrepaint()メソッドの違い paint()メソッドとは paint()は、コンポーネントを実際に描画するための処理(描画命令)を記述するメソッドです。Java AWTでは、このメソッドをオーバーライドして独自の描画処理を実装します。 一方、Java SwingではpaintComponent()メソッドをオーバーライドするのが推奨さ
-
JavaのsetBounds()メソッドとは?使い方とサンプルコードを解説
JavaのGUIプログラミングでは、レイアウトマネージャー(Layout Manager)がコンポーネントの位置やサイズを自動的に決定します。しかし、レイアウトマネージャーを使用しない場合は、コンポーネントの位置とサイズを手動で設定する必要があります。そのような場面で活躍するのがsetBounds()メソッドです。フレームのレイアウトマネージャーをnullに設定することで、コンポーネントの位置とサイズを自由に指定できるようになります。setBounds()メソッドの基本setBounds()メソッドは4つの引数を取ります。第1引数と第2引数はコンポーネントの左上隅のx座標・y座標、第3引数はコ