内部类(Nested Class) 嵌套类:
(1)静态内部类
(2)非静态内部类:
普通内部类(成员内部类):在一个外部类中直接定义的内部类。
匿名内部类:
方法内部类:在一个方法(外部类中的方法)或代码块中定义的内部类。
内部类仍然是一个独立的类,在编译之后内部类会被单独编译成独立的.class文件,但是前面冠以外部类的类名和$符号。
内部类可以使用修饰符(public ,protected,default,private)。
静态内部类的基本用法:
1.静态内部类可以包含静态成员,非静态成员。
2.静态内部类可以直接调用外部类的经验属性,静态方法。单不能调用外部类的普通属性,普通方法。
3.在不相关类中,可以直接创建静态内部类的对象(不需要通过所在的外部类)。
4.静态内部类实际上和外部类联系很少,也就是命名空间上的联系。
方法内部类的基本用法:
1.方法内部类的地位和方法内的局部变量的位置类似,均不可被修饰符修饰。
2.方法内部类只能在生命的方法内是可见的。因此定义局部内部类之后,想用的话就要在此方法内直接实例化,一定是先声明后使用。
3.方法内部类不能访问定义它的方法内的局部变量,除非这个变量被定义为final,及局部变量和方法内部类生命周期不一致。
4.方法内部类只能包含非静态成员。
5.方法内部类中不能引用所在方法的普通局部变量,除非是常量。方法的生命周期和方法内部类对象的生命周期不一致。
匿名内部类的基本用法:
匿名内部类的实例化方式:new SomeInterfaceOrClass(){?};
意味着创造一个实现或者说继承了SomeInterfaceOrClass类的对象。
Ps:根据声明的位置,判断匿名内部类是成员内部类还是方法内部类。一般是方法内部类。
三种使用方法:
继承方式,接口方式,以及参数方式
通过代码了解一下:
1 packagecom.etc;2
3 importjava.util.Date;4
5 @SuppressWarnings("all")6 public classNestedClassDemo {7 public static voidmain(String[] args) {8
9 Test4 test=newTest4();10 test.test();11 //不相关的内部类调用及实例化
12 Test4.Test t1=newTest4.Test();13 //成员内部类的实例必须借助外部类
14 Test4.Test2 t2=test.newTest2();15 System.out.println("不相关内部类:"+t1.getClass());16 System.out.println("成员内部类:"+t2.getClass());17 useCarForTest us=newuseCarForTest();18 System.out.print("继承式匿名内部类使用结果:");19 us.use();20 System.out.print("参数式匿名内部类使用结果:");21 us.useElement();22 }23 }24
25 @SuppressWarnings("all")26 classTest4{27
28 static int a=10;29 int b=20;30 //静态内部类
31 static classTest{32 private voidprintA() {33 System.out.println(a);34 //静态内部类中不能调用外部类的普通成员35 //System.out.println(b);
36 }37 }38 //普通内部类
39 classTest2{40 //成员内部类中不能有静态的成员,除非声明为final,并且只能是编译器可以确定值的常量表达式
41 int a=10;42 final static int b=20;43 /*final static Date date=new Date();*/
44 }45
46 //方法内部类,局部内部类
47 public voidtest() {48
49 classTest3{50
51 }52 //匿名内部类也可以放在方法内部类里面、为继承式匿名内部类使用
53 Runnable run=newRunnable() {54 @Override55 public voidrun() {56 System.out.println("测试1");57 }58 };59 }60
61 //定义了匿名内部类的类体,同时创建了一个匿名内部类的实例。
62 Runnable run=newRunnable() {63 @Override64 public voidrun() {65 System.out.println("测试2");66 }67 };68 }69
70
71
72 classuseCarForTest{73
74 public voidelement(Car car) {75 car.say();76 }77 //匿名内部类的使用,参数式
78 public voiduseElement() {79 element(newCar() {80 @Override81 public voidsay() {82 System.out.println("这是一辆奔驰");83 }84 });85 }86
87 //匿名内部类的使用,继承式
88 public voiduse() {89 Car car=newCar() {90 @Override91 public voidsay() {92 System.out.println("这是一辆保时捷!");93 }94 };95 car.say();96 }97 }98
99 classCar{100 public voidsay() {101 System.out.println("这是一辆车!");102 }103 }
运行效果截图:
ps:文章待完善,后续补全。