內部類-區域性內部類-匿名內部類
阿新 • • 發佈:2018-11-09
內部類(常規內部類,靜態內部類),區域性內部類,匿名內部類。
下面的述語中,成員內部類是指
常規內部類
與靜態內部類
。
getDeclaringClass():Class<?>
獲取成員內部類在定義時所在的類。
getEnclosingClass()
:Class<?>
獲取內部類在定義時所在的類。
getEnclosingConstructor():Constructor
獲取區域性或匿名內部類在定義時所在的構造器。
getEnclosingMethod():Method
獲取區域性或匿名內部類在定義時所在的方法。
isMemberClass():
檢視是否成員內部類。
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 -------------------------------------