English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、サンプルを使って内包の静的クラスを学びます。また、静的クラスと内部クラスの違いについても学びます。
前のチュートリアルに述べたように、Javaの別のクラス内にクラスを持つことができます。このようなクラスは内包クラスと呼ばれます。Javaでは、内包クラスには2種類あります:
内包の非静的クラス(内部クラス)
内包の静的クラス
前のチュートリアルで、内部クラスについて議論しました。内部クラスについて詳しく知りたい場合は、以下を訪れてくださいJavaの内包クラス。
このチュートリアルでは、内包静的クラスを学びます。
我々はキーワードstaticを使って我々の内包クラスを静的化します。
注意:Javaでは、内包クラスは静的のみが許可されています。
通常のクラスと同様に、静的内包クラスは同時に静的および非静的字段とメソッドを含むことができます。例えば、
Class Animal { static class Mammal { // Mammalクラスの静的および静的メンバー } // Animalクラスのメンバー }
静的内包クラスは外部クラスに関連しています。
静的内包クラスにアクセスするために外部クラスのオブジェクトは必要ありません。
class Animal { //内部クラス class Reptile { public void displayInfo() { System.out.println("I am a reptile."); } } //静的クラス 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(); //非静的クラスのオブジェクトの作成 Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); //静的内包クラスのオブジェクトの作成 Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); } }
出力結果
I am a reptile. I am a mammal.
上記のプログラムでは、AnimalクラスにMammalとReptileの二つの内包クラスがあります。
非静的クラスReptileのオブジェクトを作成するために、
Animal.Reptile reptile = animal.new Reptile()
静的クラスMammalのオブジェクトを作成するために、
Animal.Mammal mammal = new Animal.Mammal()
Javaでは、静的内包クラスは外部クラスに関連しています。これが静的内包クラスが外部クラスのクラスメンバ(静的フィールドやメソッド)しかアクセスできない理由です。
外部クラスの非静的フィールドやメソッドにアクセスを試みるとどうなるかを見てみましょう。
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: エラー: シンボルが見つかりません mammal.eat(); ^ symbol: メソッド eat() location: 変数 mammal の 型 Mammal 1 エラー コンパイラ 終了 ステータス 1
上記の例では、Animalクラスで非静的メソッドeat()を定義しました。
現在、もしオブジェクトmammalを使ってeat()を試みると、コンパイラはエラーを表示します。
これは、mammalが静的クラスのオブジェクトであるため、静的クラスから非静的方法にアクセスすることができないためです。
如上所述、ネストされたクラスのみが静的であることができます。静的トップクラスを持つことはできません。
静的トップクラスを試みた場合に何が起こるかを見てみましょう。
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 エラー コンパイラ 終了 ステータス 1
上記の例では、静的クラスAnimalを作成しようとしました。Javaでは静的トップクラスの使用が許可されていないため、エラーが発生します。