内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可以是静态static的,也可用public,default,protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类。
一、内部类的作用
典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。
二、内部类的访问方式
程序编译过后会产生两个.class文件,分别是Out.class和Out$In.class。其中$代表了上面程序中Out.In中的那个 .
Out.In in = new Out().new In()可以用来生成内部类的对象,这种方法存在两个小知识点需要注意
1.开头的Out是为了标明需要生成的内部类对象在哪个外部类当中
2.必须先有外部类的对象才能生成内部类的对象,因为内部类的作用就是为了访问外部类中的成员变量
三、内部类的访问控制
内部类的访问控制包括public、protected、default、private。而普通类(非内部类)的访问控制仅仅有public和友好类型。有关访问控制方面的内容,请看第二篇中的java访问控制。
四、内部类按作用域分类
1、成员内部类
2、局部内部类
1. 要创建嵌套类的对象,并不需要其外围类的对象。
2. 不能从嵌套类的对象中访问非静态的外围类对象。
注意: ①静态内部类可以用public,protected,private修饰
·只用到类的一个实例。
·类在定义后马上用到。
·类非常小(SUN推荐是在4行代码以下)
·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
注意:①留意外部类的方法的形参, 当所在的方法的形参需要被内部类里面使用时,该形参必须为final。这里可以看到形参name已经定义为final了,而形参city 没有被使用则不用定义为final。(具体原因比较复杂呢,需要了解java的编译机制,可以参考:http://android.blog.51cto.com/268543/384844/)
五、总结
内部类在java web编程中很少使用,但是在swt编程中使用较多。因此我们还是需要认证查看一下内部类的有关知识。
六、参考
1、think in java 4th
2、http://blog.sina.com.cn/s/blog_56898c310100a3i3.html
3、http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html
4、http://android.blog.51cto.com/268543/384844/