[Java Gold] インナークラスにstaticなフィールドを定義できない理由

記事内に広告が含まれています。

Java Goldの勉強のメモ。タイトルにある理由を理解するには、インナークラスとstaticについて理解する必要がある。

結論

  1. インナークラスをインスタンス化するには、外包しているクラスがインスタンス化されないといけない。
  2. staticクラスはインスタンス化しなくても利用できる状態になる。

1,2 より、インナークラスにstaticのメンバがいると設計に矛盾が生じてしまう。

インナークラスとは

インナークラスは、「クラスの中に定義されたクラス」です。

インナークラスの特徴として、外包しているクラスがインスタンス化されて初めてインスタンス化されるという特徴があります。

// Innerクラスがインナークラスに該当
//Outer の中で定義されている
public class Outer{
    private int num = 2;
    public void hoge(){
        Inner test = new Inner();
        test.data = 100;
        test.execute();
    }

    private static class Inner{
        private int data;
        void execute(){
            System.out.println(num * data);
        }
    }
}

staticとは

staticはメソッド名やクラス名によくついている修飾子です。(よくmainメソッドにいるあいつ)

public class hoge{
    public static void main(String[] args) {
        //何らかの処理
    }
}

staticがあるのとないのの大きな違いは、展開されるメモリ領域の違いがあります。staticな方は「static領域」、非staticは「ヒープ領域」とよばれる場所に展開されます。

javaのクラスファイルがロードされた際、static修飾子がついたものはstatic領域に展開され、インスタンス化されなくても呼び出すことが可能です。

クラスファイルを読み込んだとき、展開される領域が異なる

インナークラスにstatic変数を定義できない理由

インナークラスの特徴として、外包しているクラスがインスタンス化される必要があることは述べました。(インスタンスに依存している)

たいして、staticの特徴はインスタンス化してもしてなくてもアクセスできることでした。(インスタンス化に依存しない)

上記のため、インナークラスにstaticメンバを定義すると、設計上矛盾が生じてしまうため定義できないようになっています。

Java
スポンサーリンク