0
0

More than 3 years have passed since last update.

[Java]インナークラスのstatic修飾子の動作

Posted at

インナークラスのstatic修飾子

クラス内で定義されたクラスがインナークラス。
それにstatic修飾子があるかないかで振る舞いが異なる。

class Fruits {
  static ArrayList<String> fruits = new ArrayList<String>(
    Arrays.asList("Apple", "Banana")
  );
  // appleをstatic有りで、bananaをstatic無しで定義
  static String apple = "Apple";
  String banana = "Banana";

  // Appleというインナークラスをstatic有りで定義
  static class Apple {
    void eat() {
      // りんごを食べる
      fruits.remove(apple);
    }
  }

  // Bananaというインナークラスをstatic無しで定義
  class Banana {
    void eat() {
      // ばななを食べる
      fruits.remove(banana);
    }
  }
}

class Main {
    public static void main(String[] args) {
        Fruits.Apple apple = new Fruits.Apple();
        apple.eat();

        Fruits.Banana banana = new Fruits().new Banana();
        banana.eat();
    }
}

static有り(Apple)

外部クラス(Fruits)との関係性が弱く、通常のクラスのように宣言が可能。 Fruits.Apple() と直接呼び出しが可能です。

また、外部クラスとの関係性が弱いためstatic無しの変数を呼び出すことができません。
Appleクラスから、bananaを呼び出そうとするとエラーになります。

スクリーンショット 2021-01-29 15.27.16.png

static無し(Banana)

外部クラス(Fruits)との関係性が強く、Fruitsをインスタンス化してからでないと呼び出しが不可能です。

  Fruits.Banana banana = new Fruits().new Banana();
  banana.eat();

直接呼び出すとエラーになります。

スクリーンショット 2021-01-29 15.38.20.png

また、外部クラスのstaticでないメンバにアクセスが可能です。
static無しで宣言されているbananaにアクセスできます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0