内部类理解【转】
Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类。内部类又分为:常规内部类、局部内部类、匿名内部类和静态嵌套类四种。我们内部类的知识在Android手机开发中经常用到。
一、常规内部类
所谓常规内部类,或者说内部类,指的就是除去后面三种之外的内部类(这算什么解释。。。)
先写一个最简单的内部类的例子,大家感觉一下:
再写一个稍微复杂一点的内部类:
在上面的例子里我们可以清晰的看到:
下面我们再小结一下内部类的创建方法:
?
二、局部内部类
我们也可以把类定义在方法内部,这时候我们称这个类叫局部内部类。
我们再看一个例子:
我们通过上面这里例子也可以看到下面几点:
是不是有点不好理解?关于为什么用final修饰以后就可以用了,我打算专门在番外篇里专门写一篇博客给你讲清楚,先记住吧。
三、匿名内部类
当我们把内部类的定义和声明写到一起时,就不用给这个类起个类名而是直接使用了,这种形式的内部类根本就没有类名,因此我们叫它匿名内部类。
我们再看一个有趣的例子:
竟然编译和运行都很正常,我们知道抽象类和接口肯定无法实例化的,因此刚才的例子肯定有点意思:
好吧我们再看一个例子,方法参数内的匿名内部类:
view sourceprint?01public class Dog {02?03????static abstract class Ball {04????????abstract String getName();05????}06?07????void play(Ball b){08????????System.out.println(b.getName());09????}10?11????public static void main(String[] args){12????????Dog dog = new Dog();13?14????????dog.play(new Ball(){15????????????@Override16????????????String getName() {17????????????????return "qiu qiu";18????????????}});19????}20}编译和运行以后的截图我就不给你了,返回值就是“qiu qiu”。
从第14行到第18行是一句话,就是执行一个play方法,而这个方法的参数就由一个匿名内部类的实例来提供。
四、静态嵌套类
为了让你感觉舒服一些,我们也把最简单的内部类放在最后讲。
当一个内部类前面用static修饰时,我们称之为静态嵌套类或者说静态内部类。
上面的例子里其实我们已经看到过静态嵌套类了,下面我们再举一个例子:
view sourceprint?01public class Outer {02?03????static int x =1;04?05????static class Nest {06?07????????void print(){08????????????System.out.println("Nest "+x);09????????}10????}11?12????public static void main(String[] args){13????????Outer.Nest nest = new Outer.Nest();14????????nest.print();15????}16}因为静态嵌套类和其他静态方法一样只能访问其它静态的成员,而不能访问实例成员。因此静态嵌套类和外部类(封装类)之间的联系就很少了,他们之间可能也就是命名空间上的一些关联。上面例子中你需要注意的就是静态嵌套类的声明方法 new Outer.Nest() 连续写了两个类名,以至于我们都怀疑前面的Outer是个包名了,好在包名一般都小写的,要不还真分不清……
再强调一遍,内部类在Android中应用的非常多,理解和使用好显得蛮重要。