1. 程式人生 > >內部類-區域性內部類-匿名內部類

內部類-區域性內部類-匿名內部類

內部類(常規內部類,靜態內部類),區域性內部類,匿名內部類。

下面的述語中,成員內部類是指常規內部類靜態內部類

getDeclaringClass():Class<?>
獲取成員內部類在定義時所在的類。

getEnclosingClass():Class<?>
獲取內部類在定義時所在的類。

getEnclosingConstructor():Constructor
獲取區域性或匿名內部類在定義時所在的構造器。

getEnclosingMethod():Method
獲取區域性或匿名內部類在定義時所在的方法。

isMemberClass():

boolean
檢視是否成員內部類。

isLocalClass():boolean
檢視是否區域性內部類。

isAnonymousClass():boolean
檢視是否匿名內部類。

例子:

public class Test {
    public static void main(String[] params) {
        new Test().test();
    }
    //常規內部類
    public class InnerClass {
        //常規內部類
        public class InnerClass2 {

        }
    }
    //常規內部類
    public static class StaticInnerClass {
        //靜態內部內
        public static class StaticInnerClass2 {

        }
    }
    //常規內部類
    class LocalInnerClass2 { }
    Object obj2 = new Object(){ };
    public void test(){
        //區域性內部內,在方法如區域性變數一樣內的,
        class LocalInnerClass { }

        printInnerClass("常規內部類Test.InnerClass", Test.InnerClass.class);
        printInnerClass("常規內部類Test.InnerClass.InnerClass2", Test.InnerClass.InnerClass2.class);
        printInnerClass("常規內部類StaticInnerClass", StaticInnerClass.class);
        printInnerClass("靜態內部類StaticInnerClass.StaticInnerClass2", StaticInnerClass.StaticInnerClass2.class);
        printInnerClass("區域性內部類LocalInnerClass.class", LocalInnerClass.class);
        printInnerClass("常規內部類LocalInnerClass2", LocalInnerClass2.class);
        Object obj = new Object(){ };
        printInnerClass("匿名內部類obj", obj.getClass());
        printInnerClass("匿名內部類obj2", obj2.getClass());
    }

    public static void printInnerClass(String name, Class<?> clazz){
        System.out.println(name + " -> DeclaringClass=\t" + clazz.getDeclaringClass());
        System.out.println(name + " -> EnclosingClass=\t" + clazz.getEnclosingClass());
        System.out.println(name + " -> EnclosingConstructor=" + clazz.getEnclosingConstructor());
        System.out.println(name + " -> EnclosingMethod=\t" + clazz.getEnclosingMethod());
        System.out.println(name + " -> 是否成員內部類=\t" + clazz.isMemberClass());
        System.out.println(name + " -> 是否區域性內部類=\t" + clazz.isLocalClass());
        System.out.println(name + " -> 是否匿名內部類=\t" + clazz.isAnonymousClass());
        printLine();
    }

    public static void printLine() {
        System.out.println("-------------------------------------");
    }


}

結果:

常規內部類Test.InnerClass -> DeclaringClass=	class Test
常規內部類Test.InnerClass -> EnclosingClass=	class Test
常規內部類Test.InnerClass -> EnclosingConstructor=null
常規內部類Test.InnerClass -> EnclosingMethod=	null
常規內部類Test.InnerClass -> 是否成員內部類=	true
常規內部類Test.InnerClass -> 是否區域性內部類=	false
常規內部類Test.InnerClass -> 是否匿名內部類=	false
-------------------------------------
常規內部類Test.InnerClass.InnerClass2 -> DeclaringClass=	class Test$InnerClass
常規內部類Test.InnerClass.InnerClass2 -> EnclosingClass=	class Test$InnerClass
常規內部類Test.InnerClass.InnerClass2 -> EnclosingConstructor=null
常規內部類Test.InnerClass.InnerClass2 -> EnclosingMethod=	null
常規內部類Test.InnerClass.InnerClass2 -> 是否成員內部類=	true
常規內部類Test.InnerClass.InnerClass2 -> 是否區域性內部類=	false
常規內部類Test.InnerClass.InnerClass2 -> 是否匿名內部類=	false
-------------------------------------
常規內部類StaticInnerClass -> DeclaringClass=	class Test
常規內部類StaticInnerClass -> EnclosingClass=	class Test
常規內部類StaticInnerClass -> EnclosingConstructor=null
常規內部類StaticInnerClass -> EnclosingMethod=	null
常規內部類StaticInnerClass -> 是否成員內部類=	true
常規內部類StaticInnerClass -> 是否區域性內部類=	false
常規內部類StaticInnerClass -> 是否匿名內部類=	false
-------------------------------------
靜態內部類StaticInnerClass.StaticInnerClass2 -> DeclaringClass=	class Test$StaticInnerClass
靜態內部類StaticInnerClass.StaticInnerClass2 -> EnclosingClass=	class Test$StaticInnerClass
靜態內部類StaticInnerClass.StaticInnerClass2 -> EnclosingConstructor=null
靜態內部類StaticInnerClass.StaticInnerClass2 -> EnclosingMethod=	null
靜態內部類StaticInnerClass.StaticInnerClass2 -> 是否成員內部類=	true
靜態內部類StaticInnerClass.StaticInnerClass2 -> 是否區域性內部類=	false
靜態內部類StaticInnerClass.StaticInnerClass2 -> 是否匿名內部類=	false
-------------------------------------
區域性內部類LocalInnerClass.class -> DeclaringClass=	null
區域性內部類LocalInnerClass.class -> EnclosingClass=	class Test
區域性內部類LocalInnerClass.class -> EnclosingConstructor=null
區域性內部類LocalInnerClass.class -> EnclosingMethod=	public void Test.test()
區域性內部類LocalInnerClass.class -> 是否成員內部類=	false
區域性內部類LocalInnerClass.class -> 是否區域性內部類=	true
區域性內部類LocalInnerClass.class -> 是否匿名內部類=	false
-------------------------------------
常規內部類LocalInnerClass2 -> DeclaringClass=	class Test
常規內部類LocalInnerClass2 -> EnclosingClass=	class Test
常規內部類LocalInnerClass2 -> EnclosingConstructor=null
常規內部類LocalInnerClass2 -> EnclosingMethod=	null
常規內部類LocalInnerClass2 -> 是否成員內部類=	true
常規內部類LocalInnerClass2 -> 是否區域性內部類=	false
常規內部類LocalInnerClass2 -> 是否匿名內部類=	false
-------------------------------------
匿名內部類obj -> DeclaringClass=	null
匿名內部類obj -> EnclosingClass=	class Test
匿名內部類obj -> EnclosingConstructor=null
匿名內部類obj -> EnclosingMethod=	public void Test.test()
匿名內部類obj -> 是否成員內部類=	false
匿名內部類obj -> 是否區域性內部類=	false
匿名內部類obj -> 是否匿名內部類=	true
-------------------------------------
匿名內部類obj2 -> DeclaringClass=	null
匿名內部類obj2 -> EnclosingClass=	class Test
匿名內部類obj2 -> EnclosingConstructor=null
匿名內部類obj2 -> EnclosingMethod=	null
匿名內部類obj2 -> 是否成員內部類=	false
匿名內部類obj2 -> 是否區域性內部類=	false
匿名內部類obj2 -> 是否匿名內部類=	true
-------------------------------------