第10章 内部类

来源:互联网 发布:vb循环语句do while 编辑:程序博客网 时间:2024/05/17 07:58

10.1 创建内部类

    一般会在包含内部类的外部类中定义一个方法,用于返回创建的内部类对象。

    如果从外部类的非静态方法之外的位置创建某个内部类对象,就要具体指明该对象类型为:外部类名.内部类名

10.2 链接到外部类

    内部类的对象可以任意访问和修改外部类的所有方法和字段(包括外部类的private成员),就像自己拥有它们一样。

    但内部类对象只能在与其外部类对象的引用相关联时,才能被创建(即内部类是非static类,否则看不到外部类的成员,也就是必须有一个外部类对象来调用其用于返回创建的内部类对象的方法,除非你根本不打算使用外部类的成员)。

10.3 使用.this和.new

    要在内部类中生成对外部类对象的引用,可以使用外部类名.this

    要在其他类中生成某个外部类的内部类的对象,必须在new表达式中提供对其外部类对象的引用,就需要用外部对象引用.new语法。

    即必须使用外部类对象来创建内部类对象,这时因为内部类对象会暗暗地连接到创建它的外部类对象上。但如果是嵌套类(静态内部类,就不需要对外部类对象的引用了。

10.4 内部类与向上转型

    若内部类继承或实现于某个基类或接口,就可以在外部类中使用基类或接口引用来指向内部类的对象。

    若内部类是private的,就不能在其他类中去使用基类或接口进行向下转型。

    若内部类是protect的,就不能在(除非外部类的子类)其他类中去使用基类或接口进行向下转型。

10.5 在方法和作用域内的内部类

    可以在一个方法(局部内部类)或任意的作用域内定义内部类。则此内部类只在其作用域内有效。

10.6 匿名内部类

    直接通过new表达式返回的引用被自动向上转型为对基类或接口的引用。

    匿名内部类使用一个外部定义的对象时,要就其参数引是final的。除非外部对象是传给其基类构造器的

    匿名内部类不能重载其基类的构造器。

    匿名内部类可以扩展类,也可以实现接口,但是不能同时继承和实现,并且只能实现一个接口。

10.7 嵌套类

    如果不想内部类对象与外部类对象有关联,就将内部类声明为static,此时即为嵌套类。

    1)要创建嵌套类的对象,并不需要其外围类的对象

    2)不能从嵌套类的对象中访问非静态的外围类的对象

    3)普通内部类的字段与方法,不能是static的,也不能再包含嵌套类(可以再包含内部类),而嵌套类都可以。

10.7.1 接口内部的类

   在接口中嵌套类可以作为接口的一部分,由于接口中的域自动是static的,所以接口中的内部类自动是嵌套类。

   可以使用嵌套类来放置测试代码。

   接口中的嵌套类可以调用接口的方法和数据。

10.7.2 从多层嵌套类中访问外部类的成员

    嵌套类能访问所有它所嵌入的外围类的所有成员。

10.8 为什么需要内部类(P204)

    闭包与回调,应用程序框架与控制框架

10.9 内部类的继承

10.10 内部类的覆盖

    实际上子类的内部类与基类的内部类是完全独立的两个实体,各自在自己的命名空间上。

10.11 局部内部类

    局部内部类不能有访问类,因为不是外围类的一部分,但是可以访问当前代码块内的常量。

10.12 内部类标识符

    内部类的class文件名都是:外围类名$内部类名

原创粉丝点击