Java内部类的一些注意事项

       背景:最近在做一个项目,为了保证前台风格的统一,前台选用的是GWT框架。GWT通过回调的方式向后台取得数据,在前台展示,因此很多的赋值操作只能在回调函数中通过set方法来实现。我的目的是从后台读取一个配置文件的值,然后根据该配置文件的值呈现不同的页面视图。

       1. 类的成员变量如果在未赋值时使用,会被赋默认值;而方法中的局部变量,如果未赋值则会编译错误。

       2. 局部内部类和匿名内部类只能访问局部final变量。这是因为内部类或匿名类可以和它所处于的方法具有不同的生命周期,只能访问局部final变量的目的有二: 其一, 如果局部内部类或匿名内部类仍未消亡,而调用该内部类的方法可能已经退出,则该方法的局部成员变量所在的内存区已经被释放,那么内部类将不能访问到该局部成员变量,而如果该局部成员变量为final类型,则在内存中会保存一份该变量的拷贝;其二, 因为内部类可以访问方法中的局部变量,那么如果内部类对方法中的局部变量进行了修改,则会造成数据不一致的问题,为了避免这种事情,Java设置了内部类只能访问final类型的局部变量。

       3.局部内部类只能访问外部类中的静态全局变量和静态方法。我个人理解的这个原因是因为,Java的底层毕竟是采用C来实现的,回调函数是基于C编程的Windows SDK的技术成员函数都隐含了一个传递函数作为参数,亦即“this”指针,通过传递一个指向自身的指针给其成员函数从而实现程序函数可以访问类的的全局数据成员,这也可以理解为什么Java类的多个实例可以共享成员函数但是确有不同的数据成员。而回调函数中的this,指向的是回调函数本身的对象,而不是外部类对象,因此不能访问到外部类中的全局变量和方法。使用静态成员函数,静态成员函数不使用this指针作为隐含参数,这样就可以作为回调函数了。静态成员函数具有两大特点:其一,可以在没有类实例的情况下使用;其二,只能访问静态成员变量和静态成员函数,不能访问非静态成员变量和非静态成员函数。(在我的应用实例中,我原本采用了将set方法设为静态方法,将需要被赋值的全局变量也设为静态成员变量的方式来达到目的,后来感觉这样开销太大)

       4.静态方法中不能使用this对象,这点应该不用再解释了吧。

       5.使用内部类的好处有:

       a.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,

   b.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。

   c.方便编写事件驱动程序

   d.方便编写线程代码

      参考了http://www.cnblogs.com/dolphin0520/p/3811445.html

原文地址:https://www.cnblogs.com/yedu/p/4443465.html