インナークラスの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を呼び出そうとするとエラーになります。
static無し(Banana)
外部クラス(Fruits)との関係性が強く、Fruitsをインスタンス化してからでないと呼び出しが不可能です。
Fruits.Banana banana = new Fruits().new Banana();
banana.eat();
直接呼び出すとエラーになります。
また、外部クラスのstaticでないメンバにアクセスが可能です。
static無しで宣言されているbananaにアクセスできます。