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),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...
随机推荐
- Java当中的JVM
Java当中JVM 01 在使用控制面板时的实质: Hello.java使用javac,然后变成为Hello.class通过运行java这个命令,在类加载器中(含有加载,验证,准备,解析,初始化,使用 ...
- seo:网站地图提交
对于SEO,网站地图的好处就更多了: 1.为搜索引擎蜘蛛提供可以浏览整个网站的链接简单的体现出网站的整体框架出来给搜索引擎看: 2.为搜索引擎蜘蛛提供一些链接,指向动态页面或者采用其他方法比较难以到达 ...
- nginx安装,配置,并可以放静态文件教程
简单介绍一下:nginx是一个高性能的HTTP和反向代理的服务器.能有处理最高5,0000的并发量,是新兴的一个代理服务器.中国大陆使用nginx网站用户有:百度.京东.新浪.网易.腾讯.淘宝等. 安 ...
- java-BigDecimal类
1.BigDecimal类的概述和方法使用 * A:BigDecimal的概述 * 由于在运算的时候,float类型和double很容易丢失精度. * 所以,为了能精确的表示.计算浮点数,Java提供 ...
- STM32F4的sct文件理解
原文地址http://blog.sina.com.cn/s/blog_898f36590100ya2l.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...
- 线程---同步(synchronized)
实现线程同步的一种方式介绍: 思路: 首先,需要被协调的类,先实现线程,并重写run方法 然后,在被协调的类中私有化控制器,控制器实例化,由构造器带入. 其次,由控制器对象具体负责调用. 举例:循环输 ...
- String的方法capitalize
官方解释:Return a copy of the string with its first character capitalized and the rest lowercased.(返回字符串 ...
- LeetCode - Convert BST to Greater Tree
Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...
- LeetCode – First Missing Positive
Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...
- 【UOJ#22】【UR#1】外星人
2044年,Picks建成了人类第一台基于量子理论的银河系信息传递机. Picks游遍了宇宙,雇用了 n 个外星人来帮他作为信息传递机的中转站.我们将外星人依次编号为 1 到 n,其中 i 号外星人有 ...