局部内部类与其他类相比,还有一个优点就是:
它不仅能够访问包含它们的外部类的数据和方法,还可以访问定义它的块的局部变量,
但是有个前提条件:这些局部变量必须被声明为final
知识回忆:
final关键字可以应用于局部变量、实例变量、和静态变量。
在所有这些情况下,他们的含义都是一样的:
在创建这个变量之后,只能能够为之赋值一次。此后,再也不能修改它们的值了。
这就是final。
下面就让我们先看看代码是怎么访问局部变量的:
package org.innerclass.operate;
public class LocalInnerClassTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
start();
findInnerClass();
}
public static void start(){
final int localvariable=5;
class A{
public void print(){
System.out.println("我是内部类A的一个方法,任何人都都休想访问我,我对外部世界是完全隐藏的,只有start()方法有权限操作我");
System.out.println("我可以访问我的作用域中的局部变量,这个局部变量的类型必须有final关键词修饰"+localvariable);
}
}
A a = new A();
a.print();
}
public static void findInnerClass(){
System.out.println("对不起,我不能直接访问内部类A,如果想要访问,我必须先经过start(),我必须拥有调用start()的方法的权限");
}
}
来看看我们如果把final去掉会报什么错误:
根据final的知识我们知道final int localvariable = 5;是永远不变的,
这就麻烦了,如果我想要它去统计我们的内部类被执行了多少次该怎么办呢?
或者我想要这个变量在内部类中被多次的修改怎么办呢?
有没有补救的办法呢?
答案是有的:
补救的方法是使用一个长度为1的数组:
看看代码是怎么干的:
package org.innerclass.operate;
public class LocalInnerClassTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
start();
}
public static void start(){
final int[] localvariable=new int[1];
for(int i=0;i<10;i++){
A a = new A() {
@Override
public void add() {
// TODO Auto-generated method stub
localvariable[0]++;
}
};
a.add();
}
System.out.println(localvariable[0]);
}
public interface A{
public void add();
}
}
输出结果
10
分析:数组变量任然被声明为final,但是这仅仅代表不可以让它引用另外一个数组。数组中的数据元素可以自由的更改。