java|InnerClass - 内部类 - java - 细节狂魔


文章目录

  • 内部类的分类
  • 本地内部类
  • 实例内部类
    • 什么地方会用到实例内部类?
    • 一个类 具有 内部类 的 字节码文件 - 了解
    • 在实例内部类中 包含与 外部类 属性名字相同的属性。那么如何在 实例内部类中访问?
    • 实例内部类 - 重要的几个点
  • 静态内部类
    • 如何实例化 静态内部类
    • 如何访问外部类的普通的成员变量。
  • 实例内部类 和 静态内部类,哪一个更好?
  • 匿名内部类
  • 重点掌握 : 实例内部类、静态内部类、匿名内部类。

内部类的分类
1、本地内部类
2、实例内部类
3、静态内部类
4、匿名内部类
首先,我要在这声明一下,内部类也是类,不管它是属于何种类型。
说这个是为了端正你们内部类的角度。
只要是类,就会有类的特性:继承 / 被继承,实现接口,套娃【内部类再套一个内部类】 都是可行的。

?
本地内部类
本地内部类实际上用的非常少,而且不要轻易使用本地内部类。
?
本地内部类:定义在方法当中的类。
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

只能在当前方法中使用,那有什么用,鸡助。所以,我们不讲太多。

?
实例内部类
定义一个普通类,将这个类 放到 另一个普通类中。这个定义的普通类就是 实例内部类。
?
此时,另一个类就是 外部类,实际内部类 可以当做是 外部类的 一个成员变量,而且是普通实例成员变量。
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

只要是类,类的里面就可以定义属性 和 方法
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

得出结论:在实例内部类中 不能定义一个静态的成员变量和方法。
但是!如果你非要顶一个 静态的成员变量也行!
需要 在 static后面加上 final 。即 :只能定义一个静态常量。
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

再来看一下:如何实例化内部类。
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

还记得我们前面说过的可以将实例内部类当做 外部类的实例成员变量吗?
没错!实例内部类的实例化是需要借助 外部类的对象。
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

?
什么地方会用到实例内部类?
在我们模拟实现顺序表、链表、二叉树等等,我们是不是要定义的 节点类。
我们一般是放在 构建 这些数据结构类的外面,其实是可以放在放在里面的。
你可以这么去理解:就是一个类 需要有 几部分组成,而这几个可以抽象成几个类。那么这几个类就可以用到 实例内部类。
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

?
一个类 具有 内部类 的 字节码文件 - 了解 java|InnerClass - 内部类 - java - 细节狂魔
文章图片

?
在实例内部类中 包含与 外部类 属性名字相同的属性。那么如何在 实例内部类中访问? java|InnerClass - 内部类 - java - 细节狂魔
文章图片

由此得出第一个结论:当实例内部类中 包含与 外部类 属性名字相同的属性时,在实例内部类中直接输出该属性,其结果是 实例内部类中 属性的结果。
?
那么,我们该怎么做?才能输出 外部类的 属性。
方法: 外部类类名.this. 属性
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

?
实例内部类 - 重要的几个点
1、在实例内部类当中 不能定义一个静态的成员变量 和 方法。如果非要定义,只能定义一个静态常量。
2、如何实例化 实例内部类的对象 : 外部类类名.实例内部类类名 引用变量 = 外部类的对象引用.new 内部类类名();
3、实例内部类当中 如果包含了和外部类同名的成员变量。
在实例内部类的内部,访问实例内部类的成员变量时,可以不用加修饰,直接输出。
但是!在实例内部类的内部,访问外部类的成员变量时,需要加上 外部类类名.this. 同名成员变量,才能访问。

?
静态内部类 java|InnerClass - 内部类 - java - 细节狂魔
文章图片

跟 实例内部一样,静态内部类可以看作 外部类的一个 静态成员变量/方法。
因此,静态内部类 和 实例内部类,又会多出一个区别。
就是 静态内部类,可以定义 静态的成员和 方法。
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

?
如何实例化 静态内部类 java|InnerClass - 内部类 - java - 细节狂魔
文章图片

解决的办法还是一样的,既然 静态内部类可以当做是外部类的静态成员变量。
那么,就是说 需要借助 外部类就可以了。
语法: 外部类类名.静态内部类类名 引用变量 = new 外部类类名.静态内部类类名();
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

?
如何访问外部类的普通的成员变量。
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

之所以 data1 和 data2 不能访问是因为 data1 和 data2 是需要借助 外部类对象。
注意!此时静态内部类是不需要借助外部类对象的。因此,对于data1.和 data2 这种需要 借助外部类对象的 普通成员变量来说,在 静态内部类中是无法调用的。
要想访问也不难,只要能获取 外部类的对象就行了。
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

java|InnerClass - 内部类 - java - 细节狂魔
文章图片

?
实例内部类 和 静态内部类,哪一个更好?
答案:静态内部类更好!
因为 静态内部类不需要借助 外部类的对象,访问起来更加方便。
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

而且,链表 原码也是用的 静态内部类。当然还有,这里只说一个。
来看下面的图:
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

?
匿名内部类 java|InnerClass - 内部类 - java - 细节狂魔
文章图片

还有一种特殊的用法,指定某一个类的比较规则。
在上一篇文章Map && Set,带你进入Java最常用到的两个接口中用过,最后一个力扣题。
java|InnerClass - 内部类 - java - 细节狂魔
文章图片

java|InnerClass - 内部类 - java - 细节狂魔
文章图片

等于说: 有一个类实现 Comparator 接口,并重写了 compare 方法,用于指定小根堆的比较规则。

【java|InnerClass - 内部类 - java - 细节狂魔】?
重点掌握 : 实例内部类、静态内部类、匿名内部类。

    推荐阅读