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
Java内部类的一些注意事项的更多相关文章
- Java内部类使用注意事项
Java内部类使用注意事项: 1. 非静态内部类成员可以访问外部类实例成员 (如注释1),但外部类访问非静态内部类的成员 必须创建非静态内部类对象来访问其成员,如注释2 public class La ...
- Java内部类final语义实现
本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...
- Java内部类详解
Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...
- 黑马----JAVA内部类
黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA内部类 一.内部类分为显式内部类和匿名内部类. 二.显式内部类 1.即显式声明的内部类,它有类名. 2.显 ...
- java 内部类 *** 最爱那水货
注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...
- java内部类和匿名内部类
内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.clas ...
- Java内部类小程序(成员内部类,静态内部类,匿名内部类)
/** * 测试java内部类(成员内部类,静态内部类,匿名内部类) * 局部内部类不常用,就不写了. * @package :java05 * @author shaobn * @Describe ...
- [转] Java内部类详解
作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...
- java内部类的作用分析
提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...
随机推荐
- options.html:1 Refused to load the script 'xxxx' because it violates the following Content Security Policy directive: "script-src 'self' blob: filesystem: chrome-extension-resource:".
/********************************************************************************* * options.html:1 ...
- The markup in the document following the root element must be well-formed. Quartz.xml .......
这个错误说明是我的Quartz.xml文件的问题 错误描述:错误发生在文档的标记后,文档格式必须是良好的. 错误原因:我这里多写了个 </xml> 文件头的<?xml ?>只是 ...
- MAC安装python jupyter notebook
介绍: Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言. Jupyter Notebook 的本质是一个 Web 应用 ...
- How to do distributed locking
How to do distributed locking 怎样做可靠的分布式锁,Redlock 真的可行么? 本文是对 Martin Kleppmann 的文章 How to do distribu ...
- linux简单快速启用web
================= jser.me/2013/11/22/快速启动web服务的两种方式.html Python的SimpleHTTPServer需要先安装python,然后执行 pyt ...
- org.apache.commons.lang3.StringUtils中的StringUtils常用方法
https://my.oschina.net/funmo/blog/615202?p=1 public static void TestStr(){ //null 和 ""操作~~ ...
- LeetCode - Trim a Binary Search Tree
Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so that a ...
- 【spring源码分析】BeanDefinitionRegistryPostProcessor接口可自定义bean加入IOC
自定义BeanDefinitionRegistryPostProcessor BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcesso ...
- gdb入门
下面是我自己写的一个测试用例 a.c #include<stdio.h> int add(int a,int b){ return a+b; } int main(){ int n=add ...
- CommonJS 规范中的 module、module.exports 区别
CommonJS 规范中的 module.module.exports 区别 CommonJS规范规定,每个模块内部,module变量代表当前模块.这个变量是一个对象,它的exports属性(即mod ...