Java初心者講座 第一弾! 内部クラスとstaticネストクラスの違い

梅雨が明けて、蝉が鳴き始めたのを聞いて、今年も夏がやってきたなあと感じますね。

また、熱々の季節が始まるわけです。

 

さて、今回は、Java初心者講座 第一弾「内部クラスとstaticネストクラスの違い」

について、簡単に書いていきます。

続くとは言ってません。

 

Javaを始めて、コードを書いていくうちに、クラスの中にクラスを書くことが出てくると思います。

そのときにクラスにstaticをつけるか、つけないか、迷ってしまうと思います。

結論から言えば、特別な場合を除いてstaticをつけるのが良いと思います。

 

そもそもなのですが、

staticがついたネストクラス(クラスの中のクラス)は内部クラスではありません。

staticがついていないネストクラスが内部クラスです。

前者はstaticネストクラスとかよばれたりします。

 

さて、では内部クラスとstaticネストクラスの違いについて説明します。

内部クラスは、staticネストクラスと違って、一つ外のクラスのオブジェクトの参照を暗黙的に持つので、内部クラス内で一つ外クラスのフィールドやらメソッドやらにアクセスできます。

なので、一つ外のクラスのクラスメソッド内では内部クラスのオブジェクトの生成をすることができません。

 

日本語だけで話してもわかりづらいので、

コードを見てみましょう。

public class Main {
    private final String str = "outer";

    private class InnerClass {
        private void exac() {
            System.out.println(str);
        }
    }

    private static class StaticInnerClass {
        private void exac() {
            // 下記コードはエラー
            // System.out.println(str);
        }
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.exac();

        // 下記コードはエラー
        /*InnerClass innerClass = new InnerClass();
        innerClass.exac();*/
        StaticInnerClass staticInnerClass = new StaticInnerClass();
        staticInnerClass.exac();
    }

    private void exac() {
        InnerClass innerClass = new InnerClass();
        innerClass.exac();
        StaticInnerClass staticInnerClass = new StaticInnerClass();
        staticInnerClass.exac();
    }
}

まず、InnerClass(内部クラス)、StaticInnerClass(staticネストクラス)のexacメソッドをともに見てください。 InnerClassは一つ外のクラスのオブジェクトの参照を暗黙的に持っているため、Mainのインスタンスフィールドのstrにアクセスすることができます。

しかし、StaticInnerClassは、Mainのインスタンスフィールドのstrにアクセスすることができません。

 

次に、mainメソッドを見てください。

そういうことから、Mainのインスタンスを作らなくても呼ぶことができる、Mainのstaticメソッド(この場合mainメソッド)内からは内部クラスのインスタンスの生成ができません。

しかし、StaticInnerClassのインスタンスの生成はできます。

 

以上が内部クラスとstaticネストクラスの違いです。

名前の隠蔽などの問題が起こる可能性がありますし、

暗黙的に一つ外のクラスのオブジェクト参照を持たなくていい場合は、基本staticをつけるようにしましょう。

 

以上、Java初心者講座 第一弾でした。