English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Java プロセス制御

Java 配列

Java 面向オブジェクト(I)

Java 面向オブジェクト(II)

Java 面向オブジェクト(III)

Java 例外処理

Java リスト(List)

Java Queue(キュー)

Java Mapコレクション

Java Setコレクション

Java 入出力(I/O)

Java Reader/Writer

Java その他のトピック

Java 嵐加静态クラス

このチュートリアルでは、サンプルを使って内包の静的クラスを学びます。また、静的クラスと内部クラスの違いについても学びます。

前のチュートリアルに述べたように、Javaの別のクラス内にクラスを持つことができます。このようなクラスは内包クラスと呼ばれます。Javaでは、内包クラスには2種類あります:

  • 内包の非静的クラス(内部クラス)

  • 内包の静的クラス

前のチュートリアルで、内部クラスについて議論しました。内部クラスについて詳しく知りたい場合は、以下を訪れてくださいJavaの内包クラス

このチュートリアルでは、内包静的クラスを学びます。

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では静的トップクラスの使用が許可されていないため、エラーが発生します。