Javaのネストって匿名クラスくらいしか使わないけど、まぁ結構色々できるのでまとめ。
間違っていたら指摘お願いします。
import jp.co.sample.NestMaster.StaticInner; public class NestMaster { public static void main(String[] args) { String mS = "mS"; final String mfS = "mfS"; // call Inner NestMaster.Inner inner = new NestMaster().new Inner(); // トップレベルclassをインスタンス化したあとにインナークラスをインスタンス化する inner.show(); // call StaticInner NestMaster.StaticInner.staticShow(); // call static method. NestMaster.StaticInner staticInner = new StaticInner(); staticInner.show(); // call instance method. Outer outer = new Outer(); outer.show(); // call anonymous class method override. Outer anonymousOuter = new Outer(){ @Override void show() { System.out.println("anonymoutOuter class"); show2(); // 内部的には呼び出し可能 }; void show2() { // クラス内でしか呼び出しできない System.out.println(mfS); // System.out.println(mS); //Cannot refer to a non-final variable mS inside an inner class defined in a different method }; }; anonymousOuter.show(); // outer.show2(); cannot call method Outer outerMain = new Outer(); outerMain.main(); } class Inner{ void show(){ System.out.println(Inner.class); } // static void staticShow(){System.out.println(Inner.class);} // static methods can only be declared in a static or top level type } static class StaticInner{ String SISI = "SISI"; final String SIfSI = "SIfSI"; static void staticShow(){ System.out.println(StaticInner.class);} void show(){ System.out.println(StaticInner.class);} } } class Outer{ public static void main() { // call Inner NestMaster.Inner inner = new NestMaster().new Inner(); // トップレベルclassをインスタンス化したあとにインナークラスをインスタンス化する inner.show(); // call StaticInner NestMaster.StaticInner.staticShow(); // call static method. NestMaster.StaticInner staticInner = new StaticInner(); // importが必要 staticInner.show(); // call instance method. } void show(){System.out.println(Outer.class);} }
あとで整理しないと読みにくいソースになってしまったが、まとめるとこういうこと。
- インナークラス
- staticなインナークラス
- 匿名クラス