1、引言
本篇文章与前后文章没有太大的联系,仅仅作为知识点的补充~
2、内部类
2.1 内部类的概念
在Java中,我们可以将一个类定义在另一个类或者一个方法的外部,前者我们成为内部类,后者我们称为外部类。内部类是一种封装的体现。
【注】:内部类也会生成一个单独的字节码文件
2.2 内部类的分类
我们把内部类可以分为一下四种:
1.实例内部类(非静态内部类 )
2.静态内部类
3.匿名内部类
4.局部内部类
2.2.1 实例内部类
在类的内部定义了一个非静态的类,这个类就叫做实例内部类,内部类中可以定义成员变量和成员方法。
2.2.1.1 实例内部类对象的实例化
那么内部类对象该如何实例化呢?
实例化内部类对象,我们需要通过外部类对象的引用来实例化,也就是说我们需要先实例化出一个外部类对象:
(以下两种方式都是可以的)
1.
2.
2.2.1.2 内部类与外部类成员名称相同时
我们可以看到,在内部类当中,我们可以直接访问外部类的任何成员。
但是,当内部类中出现了和外部类成员变量同名的变量时,可想而知,那一定是先访问内部类自己的(就近原则),可如何访问外部类的那个变量呢?
我们就需要在方法中(非静态方法)通过 外部类类名.this.变量名 来访问了:
这样,我们就可以访问到外部类中那个同名的成员变量了,所以,实例内部类的非静态方法中包含了一个指向外部类对象的引用。
2.2.1.3 实例内部类知识点小结
1. 外部类中的任何成员都可以在实例内部类方法中直接访问
2. 实例内部类所处的位置与外部类成员位置相同(可以当做是外部类的一个普通成员),因此也受public、private等访问限定符的约束
3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问
4. 实例内部类对象必须在先有外部类对象前提下才能创建
5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用
6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。
2.2.2 静态内部类
在一个类中定义了一个使用static修饰的类,那么这个被static修饰的类就叫做静态内部类:
2.2.2.1 静态内部类中成员的访问
基于上图: 我们可以发现,在静态内部类中,我们无法访问外部类的非静态成员。
如果非要访问,那我们只能通过new外部类对象,通过引用来访问外部类成员:
2.2.2.2 静态内部类对象的实例化
静态内部类是属于外部类的,而不是属于外部类某一对象的,我们不需要再去通过外部类对象的引用来实例化,所以实例化内部类对象不需要再去new外部类对象:
2.2.3 匿名内部类
匿名内部类的本质就是隐藏了名字的内部类。
有时候,我们需要使用额外的一个类,但是只使用这一次,我们就可以将这个类定义为匿名内部类。
语法:
其实,匿名内部类的内容,只有花括号之中的内容,例如:
而 new 代表实例出了一个这个类的对象;
而 类名或者接口名 代表这个匿名内部类继承了这个类,或者实现了这个接口。
所以,花括号中的内容就是 重写的其父类或者实现的接口里面的方法。
代码演示:
这个匿名内部类是A的子类,在{}中可对继承的方法进行重写,可在{}外通过点号 . 来访问。
也可以通过接口(这个类 实现了 IA 接口 并且同时重写了test2这个方法):
2.2.4 局部内部类
定义在方法体内部的类称为局部内部类,局部内部类只能在方法体内使用,用处很少
如图:
注意:
1. 局部内部类只能在所定义的方法体内部使用
2. 不能被public、static等修饰符修饰
3. 编译器也有自己独立的字节码文件
4. 几乎不会使用
OK~本次博客到这里就结束了,
感谢大家的阅读~欢迎大家在评论区交流问题~
如果博客出现错误可以提在评论区~
创作不易,请大家多多支持~