Java学习之:内部类的相关知识

一、内部类的分类和定义

1.1 成员内部类的定义

  • 成员内部类,就是内部类的定义和成员变量在同一个位置;成员内部类中也可以有内部类方法
    在这里插入图片描述

1.2 成员内部类的使用方法

  • 间接方式: 在外部类的方法当中,使用内部类 ;在外部类的方法中创建一个内部类的对象,通过内部类的对象调用内部类的方法和变量;在外面通过调用外部类的方法实现间接调用内部类的方法和变量。
    在这里插入图片描述
  • 直接方式:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
    在这里插入图片描述

1.3 内部类的同名变量的访问方法

在这里插入图片描述

2.1 局部内部类的定义

  • 局部内部类,局部内部类中又包含着匿名内部类 ;
  • 局部内部类,顾名思义就是和局部变量的位置是相同的,在 外部类的方法 中定义的类就叫局部内部类
  • 局部内部类的使用范围就只限于当前外部类的方法中,除了自身定义的方法,就不能用了
    在这里插入图片描述

2.2 局部内部类的使用方法

  • 在外部类的方法中定义内部类
  • 在外部类的方法中创建内部类的对象
  • 通过外部调用外部类的方法,从而实现调用局部内部类的效果
    在这里插入图片描述

2.2.1 局部内部类的 final 问题

  • 如果希望局部内部类访问其所在方法的局部变量,那么这个局部变量必须是有效 final 的。
    在这里插入图片描述
    • 因为局部内部类和局部变量都存在于外部类的方法中;
    • 使用内部类调用局部变量的时候,需要在方法中将内部类通过 new 创建一个对象,那么被创建的这个对象存在于堆内存,
    • 而局部变量跟着外部方法走,存在于栈内存,方法运行结束之后立刻出栈,局部变量就会立刻消失
    • 堆内存中的成分存活时间更长,因此,为了保证局部变量被回收的时候处于堆内存中的对象依然可以正常使用,需要通过 final 关键字对这个局部变量进行修饰

2.2.2 匿名内部类(**重点)

  • 如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】;通过这种方式可以省去为接口单独定义一个实现类的繁杂过程,直接使用匿名内部类,并且在大括号中进行重写就可以完成这个过程。
    在这里插入图片描述

2.2.3 匿名内部类的注意事项

  • 匿名内部类在创建对象的时候 只能使用唯一的一次,如果希望多次创建对象,并且保持创建的对象有相同的内容,那么就需要单独地定义一个单独的实现类。
  • 匿名内部类匿名对象 有区别。匿名内部类是没有单独定义的实现类,因此在实现的时候直接 new 接口名称,通过大括号进行重写, 而匿名对象是没有对象名称,通过下面的代码进行展示:
    【使用匿名内部类】
    在这里插入图片描述
    【使用匿名内部类 + 匿名对象】
    在这里插入图片描述
    • 很明显,在这里,只能调用一个方法,所以这又牵扯到 匿名对象的性质,就是调用方法的时候只能使用一次,如果要调用两个方法 method1method2 就必须创建一个对象来调用。而匿名内部类的性质是在创建对象的时候只能使用一次。

二、内部类修饰符注意事项

  • 外部类:可以用 public 或者 (default) 修饰
  • 成员内部类:可以用 publicprotected(default)private 来修饰都可以
  • 局部内部类:前面不能有任何修饰符,因为只有当前的外部类方法可以对其进行操作;其他的都不行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值