zoukankan      html  css  js  c++  java
  • 何时使用内部类/嵌套类

    定义

    Java内部类都是解决只使用一次的类型,不过能力各有不同,侧重场景也不同
    Java关于内部类的名称实在太乱,不得不先中英文对照一下,中文只是我比较习惯,不表示什么。

    • Nested Class, *嵌套类*. 所有在类(包括方法)内部定义的类都可以叫这个名字.
    • Static Nested Class, 静态嵌套类. 或者直接说嵌套类.
    • Inner Class/Non-static Nested Class, 内部类. 这两个英文是不同的叫法.
    • Local Class, 局部类. 在方法内定义的嵌套类,
    • Anonymous Class, 匿名类. 在方法内定义, 但没有名字的类.
    • Lambda Expression, Lambda表达式. 可以认为只用一个方法的匿名类.[Java 8]
    • Method Reference, 方法引用. 可以认为是只支持转调对应函数的Lambda表达式.[Java 8]

    常见的情况

    嵌套类一次只会有一个实例,基本不需要类型名。
    首先, 最弱的需求。只需要一个非常简单的回调,与定义的位置关联很小。

    • 对于只需要一个函数调用的场景, 可以选择方法引用,Lambda表达式,和实现特定接口的匿名类.
    • *方法引用*的能力最弱, 所有应优先考虑, 当直接调用某个类的方法就可以解决问题时, 就应该使用它.

    其次, 除了直接函数调用外, 如果需要引用局部(或成员)变量,修改调用参数等,可以使用Lambda表达式.
    最后, 除了上述要求外, 当需要声明成员变量或多于一个函数时,只能使用匿名类.

    很少见的情况

    除了上述要求外, 需要多个实例或者需要类型名时, 才需要使用局部类.

    如果, 除了上述要求外, 需要外部能访问到这个类型名时, 即它会做为接口的一部分. 或者需要在多个方法中使用, 可以使用嵌套类.
    不过, 必须放弃访问方法内的局部变量以及实例成员变量.

    最后, 最强大的内部类,可以访问除了方法内局部变量外的所有成员, 同时也可以被外部直接使用.

    参考

    http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html

  • 相关阅读:
    C# 文件类的操作---删除
    C#实现Zip压缩解压实例
    UVALIVE 2431 Binary Stirling Numbers
    UVA 10570 meeting with aliens
    UVA 306 Cipher
    UVA 10994 Simple Addition
    UVA 696 How Many Knights
    UVA 10205 Stack 'em Up
    UVA 11125 Arrange Some Marbles
    UVA 10912 Simple Minded Hashing
  • 原文地址:https://www.cnblogs.com/ahuangliang/p/usage-of-nested-class-in-java.html
Copyright © 2011-2022 走看看