JAVA中的嵌套类

定义:

一个类的定义可能被嵌入另一个类中,这样的类被称为内部类。内部类可以访问外部类中定义的变量,内部类可以定义在类的方法体中。

局部类在代码块中声明,并且只在代码块中是可见的,就像其他的方法变量一样。

没有名字的局部类被称为匿名类。当仅仅需要类的单个实例是,可以使用匿名类,这也似的代码更具可读性。

使用嵌套类的原因:

  • 它们允许对相关类进行逻辑分组
  • 它们提供增强的封装特性
  • 它们使得代码具有更好的可读性和可维护性

嵌套类的分类:

  • 静态类
  • 非静态类(内部类)
    • 局部类
    • 匿名类

 创建静态嵌套类的对象的语法:

 创建非静态嵌套类(内部类):

内部类与外部类的实例相关联,可以直接访问外部类的字段和方法。内部类不能定义任何静态成员,因为内部类总是与实例相关联。要创建内部类的实例,就必须有外部类的对象。例如:

InnerOddsIterator是内部类,要创建这个类的实例,可以使用this.new调用,其中的this指向当前类的实例。

使用内部类的要点:

  • 内部类的名字必须与包含内部类的外部类的名字不同
  • 在编译外部类是,编译器会为每一个内部类生成单独的.class文件,.class文件的名字为OuterClassName$InnerClassName
  • 内部类可以使用外部类的类和实例变量,以及封闭块的局部变量
  • 内部类可以使用任何可用的访问修饰符进行声明,私有的内部类只能在外部类的范围内访问
  • 内部类可以是接口,然后由另一个内部类实现这个接口
  • 内不聊了可以是抽象的被声明为static的内部类会自动变成TopLevel类
  • 在内部类中不能声明static成员,除非内部类本身被声明为static
  • static关键字可以应用于内部类,但不能应用于外部类

局部类的重要特性:

  • 局部类仅 在定义自身的代码块中是可见的和可用的
  • 处理访问包含类中定义的字段外,局部类还可以访问任何局部变量、方法参数或在局部方法定义的作用域内的异常参数,假设它们都使用final限定符声明
  • 局部类不能使用new和super关键字
  • 局部类不能包含声明为static的字段、方法或类,因为嵌套接口是隐式静态的,局部类可能不包含嵌套接口的定义
  • 局部类不能使用public、protected、private和static修饰符声明,这些修饰符只能用于类的成员,并且不得用于局部类的声明
  • 局部类不能与任何外部类具有相同的名字
  • 接口不能被局部定义
  • 局部类可以使用自身作用域内可见的任何final局部变量或参数。

注意:如果定义在方法体中的内部类的方法师徒访问没有声明为final的方法形参,就会产生编译时错误,必须这样做以确保方法不能修改在形参中指定的变量的值。例:

 使用匿名类的限制:

  • 匿名类不能有构造函数,因为没有与之相关联的名字
  • 匿名类不能定义静态字段、方法或类
  • 在匿名类中不能定义嵌套接口,因为这些接口是隐式静态的
  • 不能匿名地定义接口
  • 像局部类一样,匿名内部类不可以声明为public、private、protected或static。事实上,在匿名类的定义语法中,并没有在声明中指定任何修饰符的规定。

使用匿名类的准则:

通常情况下,在下列上下文中应该考虑使用匿名类而不是局部类:

  • 类的主体很短
  • 只需要一个类的实例
  • 类在定义后立刻被使用
  • 类的名称不会是代码更容易理解

摘自《Java 7 编程高级进阶》 Poornachandra Sarang 著 曹如进 张方勇 译 清华大学出版社

发表评论