• 分享知识-快乐自己:快速理解(Java内部类)


    1):成员内部类

    什么是内部类?:

      内部类就是在一个类中定义另一个类。

    定义语法:

    使用命令行查看编译 产生的文件:

    如何生成内部类对象?

    创建规则:内部类对象 需要先声明外部类对象。

    内部类以及外部类的成员变量、方法 的使用?

     

    上图所示:

    编译是可以通过的,语法上是没有错误的。

    其实这个地方很容易会产生一个错觉,就好像这个 i 也变成了 B的成员,那是不是说B作为A的内部类 B是不是继承了A那?(其实不是这样的 X)内部类和继承了关系一定要搞清楚,这两者并不是一样的。

    BA的内部类就意味着在B当中可以随意使用A当中的成员变量及方法。但是这不是意味着B继承了A

    B只是能够使用A中的成员变量;而B并不拥有A的成员

    为什么可以使用那?(观察以下图)

    当生成内部类对象的时候,它首先先生成了一个外部类对象。也就是说每一个内部类都和一个外部类的对象 所关联。

    上图所示:运行结果为 4 所用的就是 a对象里面的。(完整写法如下:)

    记住一点 内部类可以随意的使用外部类公共的成员。

    2):局部内部类

    特点:

    1、类被定义在一个方法体中 代码块中

    2、类上允许使用修饰符

    3、编译的class文件会有 $1 标识

    4、可以直接访问外部类的成员

    5、可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能。

    下图所示:简单实现局部内部类。

    问题来了...

    会报错:num2 不是最终类型。

    局部内部类访问局部变量的注意事项:

    必须是 final修饰?

    为什么?

      因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立刻从堆内存中消失,还要使用那个变量。

      为了让数据还能继续被使用,就用final修饰,这样在堆内存里面存储的其实是一个常量值。通过反编译工具可以看一下。

    3):静态内部类

    静态内部类如何声明那?

      无非就是在内部的类上加上 static 关键字。

    特点如下:

    1、static 修饰

    2、可以有任意修饰符

    3、不能访问私有的静态内部类

    4、共有的内部类不依赖外部类对象,但是依赖外部类本身

    5、可以访问外部类的静态属性及方法

     

    使用静态内部类简单实现求最大值和最小值。

    4):匿名内部类

    所谓的匿名内部类是什么东西那?

      首先它是一个内部类,其次没有名字

    先看一个正常的流程案例:

    1):定义一个接口

    2):接口实现

    3):定义B 类【A 作为参数】

    4):调用运行

    另一种写法:(匿名)

    代码看起来有点可怕啰嗦,我们来解释一下。

      首先我们确认一点 fun()需要一个A类型的对象作为参数。

      这里我们写的是 new A()

    是不是有疑问,不是一直说接口不能new

      这里注意new A()后面的代码,大括号里面的这些代码和A的实现类中的几乎一模一样的几乎没有什么区别。这里只是打印的信息不一样。

    那它的区别在里那?

      主要区别在于它没有名字(称为匿名)那这个直接new的类A是不是在Test类里面 所以加起来就叫 内部匿名类。

      New 它就是生成这个内部匿名类的对象

    那么new的这个接口又是什么意思那?

      也就是说 Test 这个类要实现 A这个接口。

  • 相关阅读:
    show variables 详解
    用expect做自动应答脚本
    percona-toolkit工具检查MySQL复制一致性及修复
    Discuz论坛架构改造
    注解处理器
    ora-12514 tns 监听程序当前无法识别连接描述符中请求的服务
    内嵌Tomcat和SpringMVC的简单整合测试
    @Import导入ImportSelector实现类demo
    Mybatis-Spring项目编写测试类
    @Configuration注解作用和在Spring中的处理
  • 原文地址:https://www.cnblogs.com/mlq2017/p/10106543.html
Copyright © 2020-2023  润新知