• “基础不牢地动山摇“ ==> 重温 《内部类》


    本章导学:

    • 初始内部类
      • ArrayList使用内部类案例

    一、初识内部类

    1.1、什么是内部类

    可以将一个类的定义放在里另一个类的内部,这就是内部类。广义上我们将内部类分为四种:成员内部类、静态内部类、局部(方法)内部类、匿名内部类。

    706d211819d34e09adef6ae8e60a5c73.png

     

    1.2、使用内部类的好处

     我们都知道,Java仅支持单基础多实现,但使用内部类,每个内部类又可以去继承一个父类。

    使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。——《Think in java》

    856ba1f64b19407ab4c23bb60088787e.png

     

    1.3、使用内部类的细节

    1. 内部类可以直接访问自己的成员属性和外部类的成员属性
    2. 外部类访问内部类的成员属性,需要创建内部类对象

    内部类可以直接访问自己的成员属性和外部类的成员属性

    显而易见,自己访问自己的属性肯定是没有问题的

    d75c7d9614a4413a952e0e37df1f5d95.png

    外部类访问内部类的成员属性,需要创建内部类的对象

    00ddbeb0a980487aa26427750375035c.png

    如上图,外部类不可以直接访问内部类的成员属性,那我们如何访问内部类里的属性呢?

    我们可以在外部类(Car)里直接new内部类(Engine)的对象,然后再去访问属性

    5c3452931121489fa03f47c252c9daed.png

    创建一个测试类试试

    为了调用Engine里的engineShow()方法,我们需要创建出Engine的对象

    而Engine属于Car的内部类,按照《外部类访问内部类,需要创建内部类对象》的原则,我们需要先创建出外部类(Car)对象,然后外部类(Car)再创建出内部类(Engine)对象。

    a4253dc1b1fa451c9256ccf885abc2aa.png

    使用engineShow()方法,也可以简写成

    2bccb07780ee433bb13cddac1e3f6ac0.png

     测试一下

    b9bcf605429c4c07a22094f83edde9a9.png

     

    1.4、ArrayList使用内部类案例

    f2f89ab342494691869718d9757c9dcd.png

    我们可以看到,Itr就是ArrayList的内部类

    //举个例子,ArrayList里的迭代器(Iterator)就是内部类
    //ArrayList(外部类)访问Iterator(内部类),需要创建对象
    //比如:我们访问迭代器的hasNext方法必须先创建内部类(Iterator)的对象

     61ff41d4b9a34f30b92f3e8877d3b767.png

    这里不能写成new ArrayList().new Itr();

    因为Itr被定义成private仅自身可见,而ArrayList里有一个iterator()可以帮我们返回一个Itr对象

    d76e6f63a43b4f6a8d31124b588d7175.png

    我们模仿一下,改写我们的代码。流程如下

    1,创建Start接口,创建engineShow()

    2,修改Engine为private

    3,Engine实现Start接口,并重写engineShow()

    4,通过 接口 = new 实现类,创建Engine实现类并调用engineShow()


    创建Start接口,创建engineShow()

    daed58f3a3f6411cb5ea99cdbb7f5aad.png

    修改Engine为private

    Engine实现Start接口,并重写engineShow()

    36a58c353c524c30b3d10d1dbc1be353.png

     通过 接口 = new 实现类,创建Engine实现类并调用engineShow()

    0d6473b1eb2c4d7aa0ac56696607da97.png

    这样一来,我们就不用写两个new来创建Engine对象了,必须先创建Car对象然后通过getEngine()获取Engine对象,同时也满足了《内部类单独使用无意义》这一原则。

     

     

     

     

     

     

     

  • 相关阅读:
    Android自定义组合控件
    QChart柱状图
    英语——谐音篇——单词——单词密码
    ClickHouse—物理机部署
    代码随想录算法训练营第23期day32|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
    C++的基类和派生类构造函数
    快速展示原型之Minimal API开发
    查看系统的核心信息
    React 配置别名 @ ( js/ts 项目中通过 webpack.config.js 配置)
    buuctf-misc-wireshark1
  • 原文地址:https://blog.csdn.net/weixin_48841931/article/details/127643753