您的位置:首页 > 编程语言 > Java开发

The Java Programming Language4th读书笔记-第五章 嵌套类和接口

2015-12-25 19:52 375 查看
嵌套类型主要有两个用途:

嵌套类和嵌套接口使多个类型可以组织成逻辑上相关的组,并具有相应的作用域;

更重要的一点,嵌套类可以简单而有效地连接逻辑上相关的对象;该能力被广泛地用于事件框架;例如JavaBeans构建架构;

嵌套类型可以看作是其包围类型的一部分,它们之间是互信关系,彼此可以访问对方的所有成员;

对于静态嵌套类如何被其他类扩展是没有任何限制的–它可以被任何可以访问到它的类扩展。当然,扩展类无法继承嵌套类对其包围类的访问特权;

嵌套枚举类和嵌套接口总是静态的,尽管static修饰符按照惯例被省略;

内部类不能有静态成员,静态嵌套类型亦如此;但是可以有初始化为常量或由常量构成的表达式的final类型;

内部类对象总是与其包围类的某个对象相关联,这是充分非必要的;

Java语言并没有禁止使用深层嵌套的类,但是最好不要使用。推荐在大多数情况下只嵌套一层,两层以上的嵌套会严重地破坏程序的可读性;

如果一个内部类的方法与其包围类的方法同名,它将覆盖包围类中该同名方法的所有重载形式,即使在内部类中并没有声明该方法的这些重载形式也会如此;如此处理是因为我们没有理由假设外围类和内部类相同名字的方法会遵循相同的契约;

代码块中定义的类叫局部内部类,在定义它们的代码块的外部是无法访问到的,所以它们没有访问修饰符,也不能声明为static;局部内部类可以访问作用字段中的局部变量、方法参数、实例变量和静态变量,唯一的限制是局部变量或方法参数只有在声明称final时才可以访问,这种限制主要是由于多线程问题;

局部内部类的成员可以隐藏定义它们的程序块中的局部变量和参数,就像它们可以隐藏实例字段和方法一样,不过一旦隐藏了局部变量或参数,就无法再引用它们了;

匿名类不能有显式的extends或implements子句,也不能有任何修饰符,包括注解;也不可以有显式声明的构造器,因为它无法给构造器命名;

匿名类简单而直接,但是很容易降低程序的可读性。应该尽量避免超过6行代码的匿名类;

如果内部类被隐藏,那么原理上可以理解为字段隐藏,实际引用的内部类的类型是由所使用的引用类型确定的,即在一个给定的类中,实际引用的嵌套类型可能是在当前类中定义的,也可能是在当前类中继承而来的;

接口内部使用嵌套类一般是以下情况:

这个类只有在和该接口相关时才有意义;

为该接口定义一个部分或完整的默认实现;

需要在接口中包含共享的、可修改的数据;

任何在接口内部嵌套的类或接口都是公共的和静态的;

嵌套类型是作为Java语言的一个扩展部分添加进来的,这个扩展必须维护和旧的Java虚拟机的兼容,因为,嵌套类型是根据编译器所采用的源代码转换机制实现的。考虑一个被定义为Outer.Inner的嵌套类型,假设它是静态的或非局部的,Out.Inner就是该类在源代码中的名称。在虚拟机级别上,它被重命名为Outer$Inner;对于局部内部类,这种转换则更不明确,因为它们是不可访问的,所以它们的名字并不重要,于是这种类被命名为Outer$NInner,N是一个由一位或多位数字构成的序列。对于匿名内部类,它们的名字所具有的形式是Outer$N,N同上。

16点的问题在下列两种情况下必须处理:

当为应用打包类文件时,必须识别所有名字中有$的奇怪文件;

如果使用了反射机制来创建嵌套类实例,那么就需要了解转换后的名字;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 读书笔记