1 package Inner;
2 /**
3 * 测试内部类的使用
4 * @author 小王同学
5 * 1.成员内部类 ①非静态内部类 ②静态内部类
6 * 2.局部内部类
7 * 3.匿名内部类
8 * 总结: 内部类不只是普通的类,还可以是接口(Interface)默认static abstract修饰 ,抽象类(abstract)
9 * 使用方法内部类时,一定要在内部类中调用一下内部类中的方法否则无法使用. 列如:new Inner3().test();
10 * 成员内部类就是类的一个成员变量.
11 * 静态内部类只能使用外部类的静态成员. 普通内部类可以调用外部类的任何方法和属性,私有的也可以.
12 * 普通内部类就是方法的方法的一个局部变量,作用域只限于方法体中.
13 * 匿名内部类就是用来实现抽象方法或者是接口的抽象方法的.
14 * 使用匿名内部类实现抽象类的方法时,必须要抽象类声明为静态的(static)才行,因为在main方法中不能直接调用非静态方法.
15 */
16 public class Outer {
17 private String name;
18 private static int age;
19 //1.测试成员内部类
20 class Inner{
21 }
22 static class Inner2{
23 void run(){
24 System.out.println(age);//静态内部类只能使用外部类的静态成员。
25 }
26 }
27 //2.测试方法内部类
28 void testxx(){
29 int a =10;
30 class Inner3{
31 public void test(){//内部累的方法,可以和外部类的方法重名.
32 System.out.println("这是方法内部类");
33 System.out.println("这是外部方法的局部变量:a="+a);
34 System.out.println("这是外部方法的成员变量:age="+name);
35 }
36
37 }
38
39 new Inner3().test();//方法内部类在这里调用,不然在外界没有办法访问到
40 }
41 //3.测试匿名内部类
42 interface Inter { //接口和抽象方法也可以充当内部类使用
43 void show();
44 }
45 static abstract class Inner4{ //这里不加static的话,在使用匿名内部类时,就无法
46 abstract void jump();
47 }
48 public static void main(String[] args) {
49 //1.成员内部类
50 /**两种定义非静态内部类的方法 */
51 Inner n1 =new Outer().new Inner();
52 Outer o1 =new Outer();
53 Inner n2 =o1.new Inner();
54 /**定义静态类的方法 */
55 Inner2 n3 =new Outer.Inner2();//直接使用new 外部类.内部类();
56 //2.方法内部类
57 /**调用方法内部类的方法 */
58 new Outer().testxx();
59 //3.匿名内部类
60 /**这是实现接口的抽象方法*/
61 Inter t1= new Inter(){
62 @Override
63 public void show() {
64 System.out.println("这是匿名内部类噢噢噢噢");
65 }
66 };
67 t1.show(); //调用匿名内部类
68 /**实现抽象类的抽象方法 */
69 Inner4 in4 =new Inner4() {
70 @Override
71 void jump() {
72 // TODO Auto-generated method stub
73
74 }
75 };
76 }
77 }