Java ネストされた静的クラス
Java ネストされた静的クラス
このチュートリアルでは、例を使用してネストされた静的クラスについて学習します。また、静的クラスと内部クラスの違いについても学びます。
前のチュートリアルで学んだように、Java では別のクラス内にクラスを作成できます。このようなクラスは、ネストされたクラスと呼ばれます。 Java では、ネストされたクラスには次の 2 つのタイプがあります:
- ネストされた非静的クラス (内部クラス)
- ネストされた静的クラス
前のチュートリアルで既に内部クラスについて説明しました。内部クラスについて知りたい場合は、Java Nested Class にアクセスしてください。
このチュートリアルでは、ネストされた静的クラスについて学習します。
Java ネストされた静的クラス
キーワード static
を使用します ネストされたクラスを静的にします。
注: Java では、ネストされたクラスのみを静的にすることができます。
通常のクラスと同様に、ネストされた静的クラスには、静的および非静的の両方のフィールドとメソッドを含めることができます。たとえば、
Class Animal {
static class Mammal {
// static and non-static members of Mammal
}
// members of Animal
}
ネストされた静的クラスは外部クラスに関連付けられます。
ネストされた静的クラスにアクセスするために、外側のクラスのオブジェクトは必要ありません。
例:静的ネスト クラス
class Animal {
// inner class
class Reptile {
public void displayInfo() {
System.out.println("I am a reptile.");
}
}
// static class
static class Mammal {
public void displayInfo() {
System.out.println("I am a mammal.");
}
}
}
class Main {
public static void main(String[] args) {
// object creation of the outer class
Animal animal = new Animal();
// object creation of the non-static class
Animal.Reptile reptile = animal.new Reptile();
reptile.displayInfo();
// object creation of the static nested class
Animal.Mammal mammal = new Animal.Mammal();
mammal.displayInfo();
}
}
出力
I am a reptile. I am a mammal.
上記のプログラムでは、ネストされた 2 つのクラス Mammal があります。 そして爬虫類 クラス Animal 内 .
非静的クラス 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: error: cannot find symbol mammal.eat(); ^ symbol: method eat() location: variable mammal of type Mammal 1 error compiler exit status 1
上記の例では、非静的メソッド eat()
を作成しました。 クラス Animal 内 .
eat()
にアクセスしようとすると オブジェクト 哺乳類 を使用する 、コンパイラはエラーを表示します。
哺乳類だからです は静的クラスのオブジェクトであり、静的クラスから非静的メソッドにアクセスすることはできません。
静的トップレベル クラス
前述のように、ネストされたクラスのみを静的にできます。静的トップレベル クラスを持つことはできません。
トップレベル クラスを静的にしようとするとどうなるか見てみましょう。
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
上記の例では、静的クラス Animal を作成しようとしました . Java では静的トップレベル クラスが許可されていないため、エラーが発生します。
Java