Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのネストクラス(内部クラス)とは?静的ネストクラスと非静的ネストクラスの違いを解説

Javaでは、あるクラスの中に別のクラスを定義することができます。このようなクラスはネストクラス(Nested Class)と呼ばれます。

アクセス修飾子については、内部クラスには privatepublicprotected、デフォルト(指定なし)のいずれも使用できますが、外部クラス(トップレベルクラス)に使用できるのは public またはデフォルトのみです。

Javaで定義できるネストクラスには、大きく分けて以下の2種類があります。

  • 静的ネストクラス(Static Nested Class)
  • 非静的ネストクラス(Non-Static Nested Class / 内部クラス)

静的ネストクラス(Static Nested Class)

  • 内部クラスを static キーワード付きで定義したものが、静的ネストクラスです。
  • static キーワードを使って定義されるため、このタイプのネストクラスは外部クラスのインスタンスとの関連性を持ちません
  • 静的ネストクラスからは、外部クラスのstaticメンバー(静的メンバー)にアクセスすることができます。

コード例

class Car {
    static class Wheel {
        public void rotate() {
            System.out.println("The wheel is rotating");
        }
    }
}
public class Test {
    public static void main(String args[]) {
        Car.Wheel wheel = new Car.Wheel();
        wheel.rotate();
    }
}

実行結果

The wheel is rotating

上記の例では、Car クラスの中に静的ネストクラス Wheel を定義しています。静的ネストクラスは外部クラスのインスタンスを生成しなくても、new Car.Wheel() のように直接インスタンス化できる点が特徴です。

非静的ネストクラス(内部クラス:Inner Class)

  • 非静的ネストクラスは、Javaでは一般に内部クラス(Inner Class)とも呼ばれます。
  • 内部クラスは外部クラスのオブジェクトに紐付いて存在します。そのため、内部クラスは外部クラスの他の変数やメソッドと同様に扱われます。
  • 内部クラスは外部クラスのオブジェクト(インスタンス)と関連付けられているため、内部クラス内でstatic変数を宣言することはできません

コード例

public class OuterClassTest {
    private int a = 10;

    public void innerClassInstance() {
        InnerClassTest inner = new InnerClassTest();
        inner.outerObject();
    }

    public static void main(String args[]) {
        OuterClassTest outer = new OuterClassTest();
        outer.innerClassInstance();
    }

    class InnerClassTest {
        public void outerObject() {
            System.out.println("Outer Value of a is: " + a);
        }
    }
}

実行結果

Outer Value of a is: 10

この例では、内部クラス InnerClassTest が外部クラスのprivateフィールド a に直接アクセスしています。これは、内部クラスが外部クラスのインスタンスと強く結びついているため可能になる動作です。

まとめ

項目静的ネストクラス非静的ネストクラス(内部クラス)
staticキーワード必要不要
外部クラスのインスタンスとの紐付けなしあり
static変数の宣言可能不可
外部クラスのstaticメンバーへのアクセス可能可能

用途に応じて使い分けることで、クラスのカプセル化やコードの可読性を高めることができます。外部クラスのインスタンス状態を必要としない場合は静的ネストクラスを、外部クラスの状態に依存する処理をまとめたい場合は内部クラスを選択するとよいでしょう。

  1. Java 9のJShellで使える「/edit」コマンドの種類と使い方

    JShellは、Java 9で導入されたコマンドラインツールです。main()メソッドを用意しなくても、宣言・ステートメント・式をその場で評価できるのが大きな特徴です。さらに、JShellにはJShell Edit Padという簡易テキストエディタが組み込まれており、「/edit」コマンドで起動することで、入力済みのコードを手軽に編集できます。 /editコマンドの3つの形式 JShellで利用できる「/edit」コマンドには、次の3つの形式があります。 /edit /edit [ID] /edit [コード名] /edit:引数なしで実行すると、現在アクティブなすべてのコードがテキストエデ

  2. Javaプログラムの実行に必要な5つのステップを徹底解説

    Javaプログラムが実際に動作するまでには、大きく分けて5つの主要なステップがあります。それぞれの段階で何が行われているのか、順番に詳しく見ていきましょう。 1. 編集(Edit) 最初のステップでは、プログラマーがテキストエディタやメモ帳などのシンプルなアプリケーションを使用してJavaプログラムを作成します。ソースコードを書き終えたら、ファイル名の末尾に「.java」という拡張子を付けて保存します。 2. コンパイル(Compile) 次に、javacコマンドを実行してコンパイルを行います。この処理により、「.java」ファイルはバイトコードと呼ばれる中間形式へと変換されます。バイトコ