标签:
java内部类, 我在看《thinking in java》的时候总感觉模棱两可的, 挣扎了好几天之后, 感觉有一部分的问题想的清楚了, 写一个随笔记录一下, 以备以后修改和查看
什么是内部类?
内部类说白了就是类套类, 在一个类里面写一个类, 内部类分为两种, 一种是普通内部类(non-static nested class), 第二种是静态内部类(static nested class),也叫嵌套类.
普通内部类还包括两种特殊的类型, 一种是局部内部类, 另一种是匿名内部类
内部类有什么作用?
什么是闭包?
《thinking in java》有一段原话感觉很贴切:
闭包(closure)是一个可调用的对象, 这个对象记录着一些信息, 这些信息来自于创建他的作用域.
通过回调, 对象可以携带一些信息, 这些信息允许它在将来某个时刻调用初始的对象.
内部类就是面向对象的闭包, 创建一个内部类, 就会得到一个外部类的引用, 通过这个引用, 我们可以调用外部类对象的所有成员, 当然这些成员就是所谓的“创建他的域的信息”。除此之外,使用内部类完成闭包更加安全,因为返回的是一个引用,而不是一个指针,指针和引用可操作的权限差异不止一点点。
为什么普通内部类中不能包含static方法、static字段和嵌套类?
因为static所修饰的属性、方法都是和类相关,而非类对象相关。static成员的访问可以直接通过classname.staticField进行,而内部类的创建是和外部类相关联的,也就是要使用内部类,必须创建一个相关的外部类以提供引用,如果允许static成员的存在,那么就可以通过Outer.Inner.staticField进行访问,与是否存在外部类无关,所以不允许包含static成员。
但是普通内部类却可以包含static final类型的成员, 因为static final类型的成员是静态常量,在编译期就会将所有用到该成员的地方替换成相对应的子面值常量。所以static final类型的成员只能使用常量表达式进行初始化。
例如:
class SS { public class Test1 { public static final String str =""; public static final Integer d = new Integer(25) ; //报错:The field d cannot be declared static in a non-static inner type, unless initialized with a constant expression } }
为什么
//Java中普通内部类为何不能有static数据和static字段,也不能包含嵌套类 :http://www.dewen.io/q/13793
//thinking in java笔记,如果有不对的地方,还望指正^_^
标签:
原文地址:http://www.cnblogs.com/iamzhoug37/p/4375614.html