Java 1.1通过对Java语言规范进行修改,显着简化了一些实用结构的实现。在那些修改中,最引人注目的就是内部类和匿名类。如运用得当,它们可使程序更易理解和维护。本文介绍内部类和匿名类在Java代码中是如何具体工作的,如何正确使用它们,以及如何避免一些常见的错误。 下面来看看这些特性具体是如何工作的?
   
    1、非静态内部类
   
    如果内部类没有指定static修饰符,就拥有对外部类的所有成员的完全访问权限,包括实例字段和方法。为实现这一行为,非静态内部类存储着对外部类的实例的一个隐式引用。所以,对一个非静态内部类进行实例化需要采用不同语法的new语句:
   
    2、引用内部类
   
    内部类最自然的一种应用就是声明只在另一个类的内部使用的类,或者声明与另一个类密切相关的类。如清单B所示,它是一个链表的简单实现。由于Node类通常只在LinkedList的范围内使用,所以最好将Node声明为LinkedList的一个内部类。适用于类成员的访问控制修改符也适用于内部类;也就是说,内部类可以具有package、protected、private和public访问权限,它们的语义和正常的语义没有什么不同。由于Node要在LinkedList的外部使用,所以把它声明为public.然而,修饰符static具有不同的含义。应用于内部类时,它声明的类具有与其他类相同的语义,也就是可进行实例化,并像一个标准类那样使用。惟一的区别就是它拥有对外部类的所有静态成员的完全访问权限。清单C展示了一个简单的程序,它创建一个链表,并将它打印到标准输出设备。
   
    3、更优化的代码
   
    内部和匿名类是Java 1.1为我们提供的两个出色的工具。它们提供了更好的封装,结果就是使代码更容易理解和维护,使相关的类都能存在于同一个源代码文件中(这要归功于内部类),并能避免一个程序产生大量非常小的类(这要归功于匿名类)。

4、。new
   
    这种形式的new语句要求外部类的一个实例,使内部类能在那个实例的上下文中创建。注意清单A声明了几个非静态内部类,并用标准的new语句在Method1中实例化它们。之所以能那样做,是因为Method1是外部类的一个实例方法,所以new语句会在外部类的一个实例的上下文中隐式地执行。只有在外部类的外部或者在其他对象的上下文中实例化一个非静态内部类时,才需要使用修改过的语法。但是,非静态内部类具有一些限制。尤其是,它们不能声明静态初始化列表和静态成员,除非是在常量字段中。此外,方法内部声明的内部类不能访问方法的局部变量和参数,除非它们被初始化成final.
   
    5、匿名类
   
    匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。
   
    这就要采用另一种形式的new语句,如下所示:
   
    new <类或接口> <类的主体>
   
    这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。
   
    如果匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,这和其他任何标准的类都是一样的。如果匿名类实现了一个接口,它的主体必须实现接口的方法。
   
    注意匿名类的声明是在编译时进行的,实例化在运行时进行。这意味着for循环中的一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。
   
    从技术上说,匿名类可被视为非静态的内部类,所以它们具有和方法内部声明的非静态内部类一样的权限和限制。
   
    如果要执行的任务需要一个对象,但却不值得创建全新的对象(原因可能是所需的类过于简单,或者是由于它只在一个方法内部使用),匿名类就显得非常有用。匿名类尤其适合在Swing应用程序中快速创建事件处理程序。
   
    清单D就是一个非常简单的Swing应用程序,它展示了与匿名类有关的几个概念。这个例子创建了两个匿名类。第一个对java.awt.event.WindowAdapter进行扩展,并在应用程序窗口关闭时调用应用程序的onClose方法。
   
    即使onClose声明为private,匿名类也能调用它,因为匿名类本质上是应用程序类的一个内部类。第二个匿名类实现了java.awt.ActionListener接口,它在一个按钮被按下后关闭应用程序窗口。注意匿名类可以访问本地变量frame.这是由于匿名类在与frame相同的方法内部声明。然而,frame要被声明为final,否则会生成编译错误。
   
    6、内部类
   
    简单地说,"内部类"是在另一个类的内部声明的类。从Java 1.1开始,你可在一个类中声明另一个类,这与声明字段和方法非常相似。包装了内部类声明的类就称为"外部类".
   
    实际上,Java语言规范还允许你做更多的事情,包括:
   
    在另一个类或者一个接口中声明一个类。在另一个接口或者一个类中声明一个接口。 在一个方法中声明一个类。 类和接口声明可嵌套任意深度。

转载于:https://blog.51cto.com/cfkjava/926975

java的内部类和匿名类剖析相关推荐

  1. java内部类和匿名类

    2019独角兽企业重金招聘Python工程师标准>>> 内部类:一个类在另一个类的内部,即我们在一个类里面再写一个类. 简单来阐述两种内部类的用法: 1.内部类可以直接引用外部类的成 ...

  2. java 为什么有匿名类_全面了解Java中的内部类和匿名类

    Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了 ...

  3. 外部类、内部类、局部内部类、匿名类(Java)

    外部类.内部类.局部内部类.匿名类(Java) 代码一: public class Application {public static void main(String[] args) {Outer ...

  4. java实验八 内部类,匿名类

    实验八 内部类,匿名类 实验内容: (一)内部类.匿名类(必做) 1.三大体育媒体互联网平台,由于资源独占,有些类别的运动只能在某个平台上进行独播: 2.足球赛事只能在平台A上进行独播,篮球赛事只能在 ...

  5. Java 高级类(下) —— 内部类和匿名类

    Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了 ...

  6. java/c++中内部类、匿名类

    1.java中的内部类: class Outside{private String nameString ;private int age;Outside(){}Outside(String str_ ...

  7. Java中的内部类和匿名类

    内部类 Java中的类有两种重要的成员,即成员变量和方法.其实Java还允许类有一种成员,即在一个类中声明另一个类,这就是内部类,而包含内部类的类叫做外嵌类. 内部类和外嵌类之间的关系如下: 1.内部 ...

  8. JAVA进阶day06内部类和匿名类

    内部类分为一般内部类和静态内部类,下面贴代码分析: class Outer {private int a = 10;class Inner {public void printInfo(){Syste ...

  9. java 内部类and匿名类

    内部类 内部类 匿名类 内部类 内部类可以在类体中,或方法中声明. 内部类中不可以声明static的变量或者方法. 内部类的方法可以调用外部类的方法. public class Outer {//定义 ...

最新文章

  1. Eureka与zookeeper
  2. elasticsearch扩展ik分词器词库
  3. android之下载416错误
  4. Python 微信机器人-用itchat库向好友发送名片、转发名片实例演示
  5. php linux下保存文件路径怎么写,linux下php导入带图片的word文档转为html,图片保存下来生成路径。...
  6. 【开发技巧】解决微信author2.0回调内网本地问题
  7. java 不可修改对象_Java并发编程(六)不可改变对象
  8. const常类型说明
  9. Vue3学习笔记(B站李南江)
  10. C# + HotKey
  11. 开学送给她的礼物(Python实现)
  12. webrtc录制视频
  13. 短信验证码常见漏洞总结
  14. 微信分享之SPA的坑
  15. 对于HTML文档标题居中,导出word 和网页显示 问题
  16. python调用默认播放器_python使用Tkinter实现在线音乐播放器
  17. .CreateFeatureClass报错原因解析
  18. JAVA简单的银行管理系统
  19. android oreo 老机型,Android Oreo 通知新特性,这坑老夫先踩了
  20. 这不是广告!千万不要相信淘宝上卖的CSDN会员!!!

热门文章

  1. Unable to instantiate application
  2. C语言 · 约数个数
  3. C#读取excel数据到datatable中
  4. Android IOS WebRTC 音视频开发总结(十)-- webrtc入门002
  5. Android之自定义标题
  6. Java从零开始学二十三(集合Map接口)
  7. jconsole jvisualvm远程监视websphere服务器JVM的配置案
  8. C# 视频监控系列(10):服务器端——验证、设置画面质量、字幕叠加、板卡序列号...
  9. 影像算法瓶颈突破 汽车ADAS再进化
  10. 说说 Spring 事务管理的实现类