内部类即是在一个类中定义的一个类。外边的类成为外部类,里面的类成为内部类。外部类前面的修饰符必须是public,内部类的修饰符可以private, public, protected,编译会产生两个类,外部类名.class, 外部类名$内部类名.class
一 java内部类的分类和特点
java内部类分成四种: 成员内部类, 静态内部类,局部内部类,匿名内部类。
成员内部类
与外部类的关系,作为外部类的一个成员存在。
访问原则,内部类可以访问外部类的任何成员,但是外部类不能访问内部类的成员,可以通过新建内部类的对象来访问内部类的成员,包款private成员,所以,一个内部类的对象对生成它的外部类对象是完全可见的,包括private内部类、private成员与private方法,同时,内部类对象可以访问外部类对象的任何成员,因为非静态内部类对象有着指向其外部类对象的引用,创建非静态内部类对象时,一定要先创建起相应的外部类对象。
要获得内部类实例,可以使用外部类的对象.new 内部类的方式获得内部类的实例。
OuterClassName.InnerClassName inner=new Ouer().new Inner();
在外部类的非static方法中,如果不是static方法,也可以通过如下方式来获得内部类的实例,但是在非外部类的其他类中,必须以上面的方式来获得内部类实例。
InnerClassName inner=new Ouer.Inner();
或者
InnerClassName inner=new Inner();
静态内部类
静态内部类和成员内部类相比,第一,静态内部类和外部类之间只是嵌套关系,没有其指向外部的引用; 第二,静态内部类不仅可以有非static成员,也可以有static成员; 第三,在获得内部类实例的时候,只能用后面一种方式,但是在非外部类的其他类中,则只能使用如下的一种,即:
InnerClassName inner=new Ouer.Inner();
局部内部类
写在一个方法中,或者一个语句块中的内部类,它的作用域仅限于该方法或者语句块。
01.public class Goods2 { 02. private void internalTracking(boolean b) { 03. if (b) { 04. class TrackingSlip { 05. private String id; 06. TrackingSlip(String s) { 07. id = s; 08. } 09. String getSlip() { 10. return id; 11. } 12. } 13. TrackingSlip ts = new TrackingSlip("slip"); 14. String s = ts.getSlip(); 15. } 16. } 17. public void track() { 18. internalTracking(true); 19. } 20. public static void main(String[] args) { 21. Goods2 g = new Goods2(); 22. g.track(); 23. } 24.}
匿名内部类
对于那些只适用一次,不需要对象名的场景,在swing的事件侦听中使用的比较多,比如,以下例子,只返回一个对象。
01.public class Goods3 { 02. public Contents cont() { 03. return new Contents() { 04. private int i = 11; 05. public int value() { 06. return i; 07. } 08. }; 09. } 10.}
二 java内部类的访问原则
java内部类作为java的一个成员,和其他的成员的权限一样。
1 外部类对内部类的访问如上文所示;
2 和外部类同包的类,private的内部类不可见,其他类型的内部类中的private成员不可见,其他的均可以见;
3 和外部类不同包的类,只能访问public内部类的public成员;
4 继承外部类的类的访问,protected的内部类不可见。
如果让不可见的成员可见,可以通过添加接口方法,比如:
public class Out { public PrivateIn getPrivateIn(){ return new PrivateIn(); } private class PrivateIn implements InMethod{ private int private_arg; int default_arg; protected int protected_arg; public int public_arg;
详细见: http://zhangjunhd.blog.51cto.com/113473/65624
三 java内部类的作用
1.内部类可以很好的实现隐藏
一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可是实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用。
引文:
http://zhangjunhd.blog.51cto.com/113473/65624