Java Staticネストクラスの理解:用法、違い、実例
Java Staticネストクラス
Javaのstaticネストクラスの仕組み、インナークラスとの違い、実践的なコード例でいつ使うかを発見してください。
Javaでは、クラスを別のクラス内に定義できます。これらはネストクラスと呼ばれ、2つの形があります:
- 非staticネストクラス(インナークラス)
- Staticネストクラス
インナークラスは前回のチュートリアルで扱いました。この記事はstaticネストクラスに焦点を当てます。
Java Staticネストクラス
ネストクラスをstaticにするには、単にstaticキーワードを前置します:
class Animal { static class Mammal { // Mammalのstaticおよび非staticメンバ } // Animalのメンバ }
注意: ネストクラスのみstatic宣言可能;トップレベルクラスは不可。
通常のクラスと同様に、staticネストクラスはstaticおよびインスタンスメンバの両方を持てます。
外部クラスのstaticメンバであるため、外部クラスのインスタンスを作成せずにstaticネストクラスにアクセスできます。
例:Staticネストクラス
class Animal { // インナークラス class Reptile { public void displayInfo() { System.out.println("I am a reptile."); } } // staticネストクラス static class Mammal { public void displayInfo() { System.out.println("I am a mammal."); } } } class Main { public static void main(String[] args) { // 外部クラスインスタンスを作成 Animal animal = new Animal(); // 非staticインナークラスのインスタンス作成 Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); // staticネストクラスのインスタンス作成 Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); } }
出力
I am a reptile. I am a mammal.
上記コードでは、Mammalがstaticネストクラス、Reptileがインナークラスです。
異なるインスタンス化構文に注目:
- 非staticインナークラス:
Animal.Reptile reptile = animal.new Reptile(); - Staticネストクラス:
Animal.Mammal mammal = new Animal.Mammal();
外部クラスメンバへのアクセス
staticネストクラスは外部クラスに関連付けられているため、外部クラスのstaticメンバのみアクセスできます。インスタンスメンバを参照しようとするとコンパイルエラーになります。
例:非staticメソッド呼び出しの試み
class Animal { static class Mammal { public void displayInfo() { System.out.println("I am a mammal."); } } class Reptile { public void displayInfo() { System.out.println("I am a reptile."); } } public void eat() { System.out.println("I eat food."); } } class Main { public static void main(String[] args) { Animal animal = new Animal(); Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); mammal.eat(); // ❌ コンパイルエラー } }
出力**
Main.java:28: error: cannot find symbol mammal.eat(); ^ symbol: method eat() location: variable mammal of type Mammal 1 error compiler exit status 1
エラーは、mammalがstaticネストクラスのインスタンスであり、Animalの非staticeat()メソッドを呼び出せないため発生します。
Staticトップレベルクラス?
Javaはstaticトップレベルクラスを禁止しています。ネストクラスのみstatic宣言可能。以下のコードでコンパイルエラーを確認:
static class Animal { public static void displayInfo() { System.out.println("I am an animal"); } } class Main { public static void main(String[] args) { Animal.displayInfo(); } }
出力**
Main.java:1: error: modifier static not allowed here static class Animal { ^ 1 error compiler exit status 1
これにより、ネストクラスのみがstaticになれることが確認されます。
Java
- C# static キーワード:静的変数、メソッド、クラスをマスターする
- C# 入れ子クラスを理解する:定義、使用法、継承
- Javaのfinalキーワード完全解説:変数、メソッド、クラスでの活用法
- Java instanceof演算子完全ガイド:基本から継承・インターフェースまで
- Javaネストクラスとインナークラス完全ガイド:種類、例、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaシングルトンパターン完全解説:安全な実装と活用法
- Javaリフレクション完全ガイド:実行時のクラス・メソッド・フィールド検査
- Java ObjectOutputStream完全ガイド:シリアル化、メソッド、実践例
- Javaジェネリクス完全ガイド:再利用可能で型安全なコードの構築
- Javaファイル操作のマスター:java.ioによる作成・読み取り・書き込み・削除