我的身旁是一扇亮了又暗的窗

0%

内部类

概述

内部类:将一个类A定义再另外一个类B里面,里面的那个类A就称为内部类,B则程为外部类

成员内部类

  • 成员内部类:定义再类中方法外的类
  • 格式
1
2
3
4
5
修饰符 class 外部类{
修饰符 class 内部类{

}
}
  • 访问特点
    • 内部类可以直接访问外部类的成员,包括私有成员
    • 外部类要访问内部类的成员,必须要简历内部类的对象
    • 格式:外部类名.内部类名 对象名 = new 外部类型().new 内部类型();

内部类依然是一个独立的类,再编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号

局部内部类

  • 局部内部类:只有当前所属的方法才能使用它,除了这个方法外面就不能用了
  • 格式
1
2
3
4
5
6
7
修饰符 class 外部类名称{
修饰符 返回值类型 外部类方法名称(参数列表){
class 局部内部类名称{

}
}
}
  • 访问
    • 在局部内部类中实现类的初始化

匿名内部类

  • 匿名内部类:是内部类的简化写法。它的本质是一个带具体实现的 父类或者父接口的 匿名的子类对象。
  • 前提
    • 匿名内部类必须继承一个父类或者实现一个父接口
  • 格式
1
2
3
4
5
6
7
new 父类名或者接口名(){
// 方法重写
@Override
public void method(){
// 执行语句
}
};
  • 格式解析
    • new代表创建对象的动作
    • 接口名称就是匿名内部类需要实现那些接口
    • {…}这才是匿名内部类的内容
  • 注意
    • 匿名内部类,在创建对象的时候,只能使用唯一一次
    • 如果希望多次创建对象,而且类的内容一样的话,那么就必须使用单独定义的实现类
    • 匿名对象,在调用方法的时候,只能调用唯一一次
    • 如果希望同一个对象,调用多次方法,那么必须给对象起个名字
    • 匿名内部类是省略了实现类、子类名称,但是匿名对象是省略了对象名称
      • 匿名内部类和匿名对象不是一回事

类的特点

  • 权限修饰符
    • 外部类:public、default
    • 成员内部类:public、protected、default、private
    • 局部内部类:上面都不能写
  • 局部内部类:如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】
    • 从Java 8+开始,只要局部变量事实不变,那么final关键字可以忽略
    • 原因
      • new出来的对象在堆内存当中
      • 局部变量是跟着方法走的,在栈内存当中
      • 方法运行结束之后,立刻出栈,局部变量就会立刻消失
      • 但是new出来的对象会在对当中持续存在,知道垃圾回收消失

成员变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public Outer{
// 外部类的成员变量
int num = 10;
public class Inner{
// 内部类的成员变量
int num = 20;
public void method(){
// 内部类方法的局部变量
int num = 30;
// 局部变量,就近原则
System.out.print(num);
// 内部类的成员变量
System.out.print(this.num);
// 外部类的成员变量
System.out.print(Outer.this.num);
}
}
}