内部类

内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类

1.成员内部类

 成员内部类也称常规内部类,是指内部类直接嵌套在外部类的类体里
 这时内部类就相当于外部类的一个成员变量或成员方法,是外部类的一个成员。

在成员内部类中,可以拥有自己的成员变量和方法,也可以是一个独立的类,内部类和外部类

的实例变量是可以共存的。


创建的时候先要创建外部类然后再创建内部类。

 

 1 /*
 2  * 成员内部类
 3  */
 4 public class OuterClass {
 5     // 外部类名
 6     private String outerClassName = "outerClass";
 7     // 内部外部标志 与内部类的对象命名相同
 8     private String inOutFlg = "outer";
 9     
10     public OuterClass(){
11         System.out.println("外部类OuterClass创建完成!");
12     }
13 
14     /*
15      * 成员内部类
16      */
17     public class InnerClass {
18         // 内部类名
19         String innerClassName = "InnerClass";
20         // 内部外部标志   与外部类的对象命名相同
21         String inOutFlg = "inner";
22 
23         /*
24          * 内部类构造方法
25          */
26         public InnerClass(){
27             System.out.println("内部类InnerClass创建完成!");
28         }
29 
30         /*
31          * 打印外部类名
32          */
33         public void printOuterClassValue() {
34             // 在成员内部类中可以访问外部类的所有成员
35             System.out.println(outerClassName);
36             // 当内部类中存在与外部成员变量相同的变量时,外部成员的调用
37             System.out.println(OuterClass.this.inOutFlg);
38         }
39         /*
40          * 打印内部类名
41          */
42         public void printInnerClassValue(){
43             System.out.println(innerClassName);
44             // 当内部类中存在与外部成员变量相同的变量时,内部成员的调用
45             System.out.println(InnerClass.this.inOutFlg);
46         }
47     }
48     
49     /*
50      * 外部类内部对内部类的访问
51      */
52     void getClassName (){
53         InnerClass innerClass = new InnerClass();
54         innerClass.printOuterClassValue();
55     }
56 
57 }

测试:

 1     public static void main(String[] args) {
 2         // 外部类的创建
 3         OuterClass out = new OuterClass();
 4         // 从外部类访问内部类的成员函数
 5         out.getClassName();
 6         // 内部类的创建
 7         OuterClass.InnerClass innerClass = out.new InnerClass();
 8         // 访问内部类的成员函数
 9         innerClass.printInnerClassValue();
10     }
11 
12 }

 

 

2.局部内部类

局部内部类也称方法内部类,它对外面的所有类来说都是隐藏的,即使是它所属的外部类,仅有它所在的方法知道它;

它不仅可以访问它所属外部类中的数据,还可以访问该方法中定义的局部变量,不过局部变量必须声明为final类型。

 

接口声明:

1 public interface InnerClassIF {
2     // 打印内部类名
3     void printInnerClassValue();
4     // 打印外部类名
5     void printOuterClassValue();
6     // 打印方法内定义的变量
7     void printOuterMethodValue();
8 }

 

 

 1 /*
 2  * 方法内部类
 3  */
 4 public class OuterClass {
 5     // 外部类名
 6     private String outerClassName = "outerClass";
 7     // 内部外部标志 与内部类的对象命名相同
 8     private String inOutFlg = "outer";
 9     
10     public OuterClass(){
11         System.out.println("外部类OuterClass创建完成!");
12     }
13     
14     /*
15      * 方法内部定义的类,只能在该方法范围内访问
16      */
17     InnerClassIF getClassName (){
18         String path = "D盘";
19         final String classPath = "C盘";
20 
21         /*
22          * 方法内部类
23          */
24         class InnerClass implements InnerClassIF {
25             // 内部类名
26             String innerClassName = "InnerClass";
27             // 内部外部标志   与外部类的对象命名相同
28             String inOutFlg = "inner";
29 
30             /*
31              * 内部类构造方法
32              */
33             public InnerClass(){
34                 System.out.println("内部类InnerClass创建完成!");
35             }
36 
37             /*
38              * 打印外部类名
39              */
40             public void printOuterClassValue() {
41                 // 在方法内部类中可以访问外部类的所有成员
42                 System.out.println(outerClassName);
43                 // 当内部类中存在与外部成员变量相同的变量时,外部成员的调用
44                 System.out.println(OuterClass.this.inOutFlg);
45             }
46             /*
47              * 打印内部类名
48              */
49             public void printInnerClassValue(){
50                 System.out.println(innerClassName);
51                 // 当内部类中存在与外部成员变量相同的变量时,内部成员的调用
52                 System.out.println(InnerClass.this.inOutFlg);
53             }
54             /*
55              * 打印方法内定义的变量
56              */
57             public void printOuterMethodValue(){
58                 // 在方法内部类中只能访问该方法中用final定义的成员
59                 System.out.println(classPath);
60             }
61         };
62         return new InnerClass();
63     }
64 
65 }

测试:

 1     public static void main(String[] args) {
 2         // 外部类的创建
 3         OuterClass out = new OuterClass();
 4         // 访问成员方法,返回内部类对象的引用
 5         InnerClassIF innerClassIF = out.getClassName();
 6         innerClassIF.printInnerClassValue();
 7         innerClassIF.printOuterClassValue();
 8         innerClassIF.printOuterMethodValue();
 9         
10     }

 

3.静态内部类

在一个内部类前添加修饰符static,这个内部类就变为静态内部类。在一个静态内部类中可以声明静态成员和非静态成员,但是在非静态内部类中

不可以声明静态成员。同样,在静态内部类中不能访问外部类的非静态成员。

静态内部类的对象可以直接生成,不需要外部类的对象来生成,可以把静态内部类看作是一个顶级类。

静态内部类不可以用private来修饰。

 

 1 /*
 2  * 静态内部类
 3  */
 4 public class OuterClass {
 5     // 外部类名
 6     private static String outerClassName = "outerClass";
 7     // 内部外部标志 与内部类的对象命名相同
 8     private static String inOutFlg = "outer";
 9     
10     public OuterClass(){
11         System.out.println("外部类OuterClass创建完成!");
12     }
13 
14     /*
15      * 静态内部类
16      */
17     public static class InnerClass {
18         // 内部类名
19         static String innerClassName = "InnerClass";
20         // 内部外部标志   与外部类的对象命名相同
21         String inOutFlg = "inner";
22 
23         /*
24          * 内部类构造方法
25          */
26         public InnerClass(){
27             System.out.println("内部类InnerClass创建完成!");
28         }
29 
30         /*
31          * 打印外部类名
32          */
33         public static void printOuterClassValue() {
34             // 在静态内部类中可以访问外部类的所有静态成员
35             System.out.println(outerClassName);
36             // 当内部类中存在与外部成员变量相同的变量时,外部成员的调用
37             System.out.println(OuterClass.inOutFlg);
38         }
39         /*
40          * 打印内部类名
41          */
42         public void printInnerClassValue(){
43             System.out.println(innerClassName);
44             // 当内部类中存在与外部成员变量相同的变量时,内部成员的调用
45             System.out.println(InnerClass.this.inOutFlg);
46         }
47     }
48 }

测试:

1     public static void main(String[] args) {
2         // 外部类直接访问静态内部类的静态方法
3         OuterClass.InnerClass.printOuterClassValue();
4         // 访问静态内部类的非静态方法
5         OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
6         innerClass.printInnerClassValue();
7     }

 

4.匿名内部类

匿名内部类是唯一一种没有构造方法的类。大部分匿名内部类用于接口的回调。

 1 public class InnerClassTest {
 2     public static void main(String[] args) {
 3         ArrayList<Integer> valueList = new ArrayList<>();
 4 
 5         valueList.add(26);
 6         valueList.add(2);
 7         valueList.add(5);
 8         valueList.add(4);
 9         valueList.add(19);
10         valueList.add(15);
11         valueList.add(1);
12         valueList.add(3);
13         valueList.add(6);
14         valueList.add(30);
15         
16         // 匿名内部类用于继承其他类或实现接口,只是对继承方法的实现与重写,不需要添加额外的方法
17         Collections.sort(valueList, new Comparator<Integer>() {
18 
19             @Override
20             public int compare(Integer o1, Integer o2) {
21                 // 升序
22                 if (o1.intValue() < o2.intValue()) {
23                     return -1;
24                 }
25                 return 0;
26             }
27         });
28         
29         for (int i = 0; i < valueList.size(); i++) {
30             System.out.println(valueList.get(i));
31         }
32     }
33 }

 

posted @ 2014-03-14 23:20  keyiei  阅读(192)  评论(0编辑  收藏  举报