内部类

内部类定义了各种规则,初学起来感到很复杂,而且很多规则现在还是不清楚。比如说:非静态内部类中不能定义静态变量。不过感觉就是规则,先记住。内部类根据在不同的地方的定义分为了成员内部类,静态内部类,局部内部类和匿名内部类。而匿名内部类的使用才是最多的,所以感觉其它的几项只会在面试的时候出现,而匿名内部类最好还是掌握。

 1 package javabase;
 2 
 3 public class Innerclass {
 4 /**
 5  * 内部类的定义实现多继承,接口的多实现只提供了一种解决途径
 6  * 内部类分为:成员内部类,局部内部类,静态内部类,匿名内部类
 7  * 
 8  * 
 9  * 
10  * 成员内部类和静态内部类的例子:
11  * 成员内部类中不能定义静态成员;
12  * 成员内部类中能够访问外部类的所有成员;
13  * 静态内部类包含静态方法,出现了访问局限性,只能访问静态的外部成员。
14  * 
15  * public class Outer(){
16  *     private static int i=1;
17  *     private int j=2;
18  *     private int k=3;
19  *     public static void outer_f1(){};
20  *     public void outer_f2(){};
21  *  
22  *  class Inner(){
23  *      static int inner_i=10;//成员内部类中不能定义静态变量
24  *      int j=20;//内部类中的成员变量能够和外部内中的成员变量同名共存,并且复写外部类中的值
25  *      int inner_i=10;
26  *      void inner_f1(){
27  *      System.out.println(inner_i);      //在内部类中访问内部类自己的变量直接用变量名
28  *        System.out.println(this.j);          //在内部类中访问内部类自己的变量也可以用this.变量名 
29  *        System.out.println(Outer.this.j); //在内部类中访问外部类中与内部类同名的实例变量用外部类名.this.变量名
30  *        System.out.println(k);           //如果内部类中没有与外部类同名的变量,则可以直接用变量名访问外部类变量
31  *        outer_f1();
32  *        outer_f2();
33  *    }    
34  *外部类的非静态方法访问内部类需要建立内部类的对象
35  *    public void outer_f3(){
36  *        Inner inner = new Inner();
37  *        inner.inner_f1();
38  *    }
39  *外部类的静态方法访问内部类(1)建立外部类的引用(2)建立内部类的对象(3)访问内部成员
40  * public static void outer_f4(){
41  *        Outer outer=new Outer();
42  *        Inner inner=outer.new Inner();
43  *        inner.inner_f1();
44  *    }
45  * public static void main(String[] args){
46  * 
47  * 
48  *创建类对象
49  *若内部类为非静态的
50  *new Outer().new Inner();
51  *若内部类为静态的 
52  *new Outer.Inner()
53  *若内部类为静态的且内部方法为静态的
54  *new Outer.Inner
55  *}
56  * 
57  * 
58  * 局部内部类的例子
59  * (1)内部类访问局部变量时,被访问的局部变量需要被修饰为最终类型(不明原因)
60  * (2)不可以被成员修饰符修饰
61  * 
62  * 
63  * 匿名内部类的例子
64  * (1)匿名内部类其实就是内部类的简写格式
65  * (2)定义匿名内部类的前提:匿名内部类必须继承一个类或者实现一个接口
66  * (3)匿名内部类的写法:(正常写法是继承父类、复写父类的方法、创建子类对象、调用子类方法;)一旦变成匿名内部类以后,因为没有了方法名,
67  * 因而书写时直接创建父类的对象、覆盖父类的方法体、调用方法;可以理解为带内容的匿名子类对象
68  * (4)匿名内部类定义的方法不要超过3个,如果过多的话覆盖起来会显得很臃肿,代码段过长,影响阅读。
69  * 
70  * 举个例子:
71  * Interface Inner{
72  *     void method();
73  * }
74  * class Test{
75  *    //补足代码,通过匿名内部类
76  * }
77  * public static void main(String[] args){
78  *     Test.function().method();
79  * }
80  * 
81  * 如果不使用匿名内部类的写法
82  * class Inner implements Inner{
83  *     void method(){};
84  * }
85  * static Inner function(){
86  *     return new Inner();
87  * }
88  * 
89  * 若使用匿名内部类的写法
90  * static Inner function(){
91  *     return new Inner()
92  *     {void method(){}};
93  * }
94  * }
95  */
96 }

 

 

posted @ 2013-05-08 15:51  hustsing  阅读(157)  评论(0)    收藏  举报