内部类
一、概述
-
定义:
当一个类的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为该类提供服务,那么最好使用内部类
-
Java中允许将一个类A声明在一个类B中,则类A就是内部类,类B称为外部类
-
分类:
成员内部类(静态、非静态)
局部内部类(创建在代码块、构造器、方法内)
二、内部类特性
-
作为外部类的成员结构
① 可以被static修饰
② 可以被4种不同的权限修饰符修饰 -
作为一个类
① 类内可以定义属性、代码块、构造器、方法。
② 可以被final修饰,表示此类不能被继承。
③ 可以调用外部类的结构
三、搞清楚 3 个问题
- 如何实例化成员内部类的对象
- 如何在成员内部类中区分调用外部类的结构
- 开发中局部内部类的使用
package inner;
import static javax.swing.text.html.HTML.Tag.DD;
public class InnerClassTest {
public static void main(String[] args) {
// 1.外部类实例化,就实现了对代码块内部类和构造器内部类的调用
Person p = new Person();
// 2.局部内部类的调用,通过调用局部内部类所在方法实现
p.inner();
// 3.非静态成员内部类的调用,外部类对象调用。
Person.DD dd = p.new DD();
dd.dMethod();
// 4.静态成员内部类的调用,外部类类名调用
Person.EE ee = new Person.EE();
ee.eMethod();
}
}
// 外部类
class Person{
String name = "外部类的属性";
int age;
// 1.外部类的代码块
{
// 1.1 代码块的内部类
class AA{
public void aMehtod(){
System.out.println("代码块内的局部内部类");
}
}
// 1.2 实例化内部类
AA aa = new AA();
// 1.3 内部类对象调用自身方法
aa.aMehtod();
}
// 2.外部类的构造器
public Person(){
// 2.1 构造器的内部类
class BB{
public void bMethod(){
System.out.println("构造器内的局部内部类");
}
}
// 2.2 实例化内部类
BB bb = new BB();
// 2.3 内部类对象调用自身方法
bb.bMethod();
}
// 3.外部类的方法
public void inner(){
// 3.1 方法内的内部类
class CC{
public void cMethod(){
System.out.println("方法内的局部内部类");
}
}
// 3.2 实例化内部类
CC cc = new CC();
// 3.3 内部类对象调用自身方法
cc.cMethod();
}
// 4.非静态成员内部类
class DD{
// 4.1 成员内部类的属性
String name = "内部类的属性";
// 4.2 成员内部类的方法
public void dMethod(){
System.out.println("非静态成员内部类方法");
}
// 4.3 成员内部类方法内的结构调用
public void dTransfer(String name){
// ① 调用形参
System.out.println(name);
// ② 调用当前类的属性
System.out.println(this.name);
// ③ 调用外部类的属性
System.out.println(Person.this.name);
// ④ 调用外部类的方法
Person.this.inner();
}
}
// 5.静态成员内部类
static class EE{
public void eMethod(){
System.out.println("静态成员内部类方法");
}
}
}