zoukankan      html  css  js  c++  java
  • java内部类

    java内部类作用

    为什么在Java中需要内部类?总结一下主要有以下四点:

      1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类使得多继承的解决方案变得完整,

      2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。

      3.方便编写事件驱动程序

      4.方便编写线程代码

      个人觉得第一点是最重要的原因之一,内部类的存在使得Java的多继承机制变得更加完善。

    ◆Java内部类

    一、 含义


    在Java编程语言里,程序是由类(class)构建而成的。在一个类的内部也可以声明类,我们把这样的类叫做内部类。

    二、 作用


    实现了更好的封装,我们知道,普通类(非内部类)的访问修饰符不能为private或protected,而内部类可以。当我们将内部类声明为private时,只有外部类可以访问内部类,很好地隐藏了内部类。

    内部类可以继承(extends)或实现(implements)其他的类或接口,而不受外部类的影响。

    内部类可以直接访问外部类的字段和方法,即使是用private修饰的,相反的,外部类不能直接访问内部类的成员。

    三、 原理


    内部类是一个编译时的概念,编译后会生成两个独立的class文件,如下:

    编译后的文件如下图:

    编译后Outer.Inner被重命名为Outer$Inner,句点(.)被替换成了美元符号($)。

    四、 分类


    Java内部类可分为成员内部类、局部内部类、匿名内部类、静态内部类。

    1) 成员内部类

    成员内部类可以看成是外部类的一个成员,在成员内部类中无法声明静态成员,但staticfinal字段是个例外。我们知道加载类时,会先初始化静态成员,如果成员内部类有静态成员,那么内部类就会在外部类之前生成,而内部类是为外部类服务的,内部类在外部类之前就生成可能会脱离掌控。在实例化成员内部类时,成员内部类会持有一个外部类当前对象的引用,这样在成员内部类中就可以直接访问外部类的成员,即使是private修饰的。

    运行结果:

    inner

    outer

    outer

    成员内部类对外部类对象的引用,是通过在this前面加上外部类的名字构成的,这种形式叫作限定-this,out.println(outerName)与out.println(Outer.this.outerName)是等价的。

    2) 局部内部类

    局部内部类的使用和成员内部类的使用基本一致,只是局部内部类定义在外部类的方法中,就像局部变量一样,并不是外部类的成员。局部内部类在方法外是无法访问到的,但它的实例可以从方法中返回,并且实例在不再被引用之前会一直存在。局部内部类也可以访问所在方法的局部变量、方法参数等,限制是局部变量或方法参数只有在声明为final时才能被访问。

    运行结果:

    outer:lalala

    3) 匿名内部类

    可以把匿名内部类想象成是没有类名的局部内部类,匿名内部类有以下特点:

    1、匿名内部类不能有构造器,匿名内部类没有类名,肯定无法声明构造器。

    2、匿名内部类必须继承或实现一个接口,指定给new的类型为匿名类的超类型,匿名类不能有显示的extends或implements子句,也不能有任何修饰符。

    3、匿名内部类和成员内部类、局部内部类一样,也不能声明静态成员。

    运行结果:

    outer:lalala

    4) 静态内部类

    静态内部类,有的书上也称为嵌套类,声明它时需要用static修饰符,静态内部类不同于前三种内部类,静态内部类不会持有外部类当前对象的引用,所以在静态内部类中无法访问外部类的非静态成员,可以这么说,静态内部类不依赖于外部类。

  • 相关阅读:
    Android自定义之仿360Root大师水纹效果
    Android之TextView的Span样式源码剖析
    Android之TextView的样式类Span的使用详解
    随着ScrollView的滑动,渐渐的执行动画View
    仿微信主界面导航栏图标字体颜色的变化
    android自定义之 5.0 风格progressBar
    Android性能优化之内存篇
    Android性能优化之运算篇
    How to install Zabbix5.0 LTS version with Yum on the CentOS 7.8 system?
    How to install Zabbix4.0 LTS version with Yum on the Oracle Linux 7.3 system?
  • 原文地址:https://www.cnblogs.com/talkingcat/p/13432303.html
Copyright © 2011-2022 走看看