内部类
概念:在一个类的内部再定义一个完整的类。与实例变量相、实例方法同级别的类。
下面就是一个内部类的案例
public class testOne {
public static void main(String[] args) {
Outer out = new Outer();
Outer.Inner in = out.new Inner();
in.m2();
}
}
class Outer{**//外部类**
int a = 10;//外部类实例变量
public void m1() {
}
class Inner{//内部类
int b = 20;//内部类实例变量
public void m2() {
System.out.println(Outer.this.a);
System.out.println("Class Inner m2()");
}
}
}
二、局部内部类访问外部类当前方法中的局部变量
局部类访问外部类当前方法中的局部变量时,因无法保障变量的声明周期与自身相同,变量必须修饰为 final。
在开展这方面之前你要了解一些关于JVM处理变量的知识。
下面是一个案例
public class testInner {
public static void main(String[] args) {
Outer out = new Outer();
out.mc1();
}
}
class Outer{
public void mc1() {
int a = 20;//方法中的局部变量
class Inner{
public void mc2() {
//a = 30;
//当局部内部类访问外部常量时,默认将外部常量添加final,所以“a = 30”部分代码运行时一定错误。
System.out.println(a);
}
}
Inner in = new Inner();
in.mc2();
}
}
在代码里面Inner类的方法mc2中,可以明显看到不能更改 a 的值。如果更改就会报错,此时错误类型就会显示:
“Local variable a defined in an enclosing scope must be final or effectively final”
查找错误原因就是因为,在内部类“Inner”中,访问外部类“Outer”方法中的变量“a”时,JVM会默认在 “int a = 20”的前面加上“final”关键字,使之成为一个常量。
原因就是因为,上图中JVM垃圾处理的运行机制。
mc1 方法中的局部变量 a,在此方法结束之后本应被回收。但是因为内部类 Inner 中的 mc3 方法调用了局部变量 a。这时局部变量 a,不能被回收,所以虚拟机默认将变量 a添加修饰符“final”,使变量 a,变为常量,这样本应该收回的变量 a,为了顺应方法调用变为常量。