使用内部类的原因
1.内部类方法可访问所在的作用域的数据(包括私有)
2.内部类对同胞其他类是隐藏的
3.定义回调函数但是不想写大量代码
内部类的一些特点
内部类的域可以是公有的,与此同时它们又仍然是安全的,内部类的对象会持有一个隐式的引用,它引用了实例化该内部类的外围类对象,但是在static内部类没有。只有内部类私有时仍具备可用性。
内部类会被编译器翻译成"外部类名$内部类名"的常规类文件,构造器参数为外部类对象,并且会产生一个final外部类的一个实例域(finale 外部类 this$0),而外部类则会在编译后出现一个static boolean access$0(外部类对象),通过这个方法可以读取外部类的私有域,对于内部类而言,因为虚拟机中是不存在私有类的,因此,编译器会利用私有构造器生成一个包可见的类:private 外部类$内部类(外部类对象),但是并没有人可以调用这个构造器,所以还存在另外一个构造器,外部类$内部类(外部类,外部类$1),将在他的内部调用第一个构造器,然后讲第一个参数置为null。
当一个内部类仅使用一次的时候,可以在方法中定义一个局部内部类,这个类不能被public或者private修饰,作用于只在这个方法,方法外部也是无法访问的。局部内部类可以访问局部变量,但局部变量必须声明为final。编译器会将在局部内部类中使用到的属于方法的局部变量进行备份并用final修饰,形如:final 类型 val$变量名。
当只需要创建一个内部类对象时,不必对类命名,可以采取匿名内部类的方式实现。
类变量或接口变量 m = new 类名或接口名(){} ,可以如此接收一下这个对象以便调用。
有一个有趣的问题是在一个静态方法里如何获得一个外部类?首先得获得内部类,但是在static方法中并不存在this引用,那么此时可以new Obejct(){}.getClass().getEnclosingClass()即可。
再来说一说静态内部类,静态内部类并不需要引用外部类对象(this$0),因此可以在不需要外部对象引用时将类声明为静态的内部类。在静态方法内构造对象的内部类,必须要用static修饰,否则编译器会给出错误报告:没有可用的隐式外部类对象用于初始化内部类对象(此处参考前面所说内部类会获得一个final的外部类实例域)。
关于内部类我自己没有动手写一写代码只有一些理论上的知识分享给大家。
学习自java核心技术 卷I