内部类
1、概念:把类定义在其他类的内部,我们称之为内部类;
2、内部类的特点
1)内部类可以访问外部类的成员,包括私有;
2)外部类想要访问内部类的成员,必须要创建内部类的对象;
3、内部类定义的格式:
1)
3、按在类中定义的位置不同,可以分为如下两种格式:
1)成员内部类:
<1>、定义在类的成员位置;
<2>、内部类可以访问外部类的成员,包括私有;
<3>、定义格式
a、外部类名.内部类名 对象名 = new 外部类名().new 成员内部类名();
b、当内部类是被静态所修饰的时候,出现了另外一种创建内部类的方式
外部类名.内部类名 对象名 = new 外部类名.内部类名();
2)局部内部类:
<1>、定义在方法中的类;
<2>、局部内部类可以直接访问外部类中所有的成员;
<3>、要想使用局部内部类中的方法,在定义局部内部类的成员方法中,
创建局部内部类对象调用方法。
3)匿名内部类:
<1>、语句定义格式:
new 类名(可以是抽象类/具体类/接口)(){
要重写的方法;
}
举例: interface A{
b();
c();
}
class B implements A{
b(){...}
c(){...}
}
A a = new B();
a.b();
a.c();
上述用匿名内部类改进为:
A a = new A(){
b(){...}
c(){...}
};
<2>、匿名内部类存在的前提:
要存在一个类或者是一个接口,这个类可以是具体的也可以是抽象的;
<3>、局部内部类访问局部变量的注意事项:
必须被final修饰?
为什么呢?
因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从
堆内存中消失,还要使用那个变量。为了让数据还能继续被使用,就用fianl修饰,
这样,在堆内存里面存储的其实是一个常量值。通过反编译工具可以看一下。