/*
* 局部内部类: 即在方法中定义的内部类,与局部变量类似,
* 在局部内部类前不加修饰符public或private,其范围为定义它的代码块。
*
* 注意:局部内部类中不可定义静态变量,可以访问外部类的局部变量(即方法内的变量),
* 但是变量必须是final的。
*
* 注意:
* 在类外不可直接生成局部内部类(保证局部内部类对外是不可见的)。要想使用局部内部类时需要生成对象,
* 对象调用方法,在方法中才能调用其局部内部类。通过内部类和接口达到一个强制的弱耦合,
* 用局部内部类来实现接口,并在方法中返回接口类型,使局部内部类不可见,屏蔽实现类的可见性。
*
*/
public class Outer {
private int s = 100;
private int out_i = 1;
public void f(final int k){
final int s = 200;
int i = 1;
final int j = 10;
//定义在方法内部
class Inner{
int s = 300;//可以定义与外部类同名的变量
//static int m = 20;//不可以定义静态变量,因为此变量在方法内,而此方法非静态,因此变量m不可能在类的加载时完成加载
Inner(int k){
inner_f(k);
}
int inner_i = 100;
void inner_f(int k){
System.out.println(out_i);//如果内部类没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量
System.out.println(k);
//可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的.因为内部类中的成员是加载到堆内存中,而局部变量加载到栈内存中
//随方法结束而结束,而内部类中的对象当还在被引用就不会变垃圾.因此被局部内部类使用的局部变量就必须用final修饰.
System.out.println(j);
System.out.println(s);//如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量
System.out.println(this.s);//用"this.变量名" 访问的也是内部类变量
System.out.println(Outer.this.s);//用外部"外部类类名.this.变量名" 访问的是外部类变量
}
}
new Inner(k);
}
}
public class OuterDemo {
public static void main(String[] args) {
Outer outer = new Outer();
outer.f(50);
}
} |
|