刚学内部类,这个东西真的很绕,不好理解,比如下面这个:"局部内部类只能访问父方法中的final变量。"应该怎么理解呢?(除了死记)
为什么定这条规则?
还有,下面这个用法为什么不行?
class xt{
public static void main(String in[]){
l lo=new l();
l.ll llo=lo.new ll();
}
}
class l{
static int n=101;
static int l=103;
static void uu(){
System.out.println(l);
}
static class ll{
int m=102;
void tt(){
System.out.println(n);
}
}
}
为什么定这条规则?
还有,下面这个用法为什么不行?
class xt{
public static void main(String in[]){
l lo=new l();
l.ll llo=lo.new ll();
}
}
class l{
static int n=101;
static int l=103;
static void uu(){
System.out.println(l);
}
static class ll{
int m=102;
void tt(){
System.out.println(n);
}
}
}
继承的话在类声明后面加上 extends + 父类名称
例如:public class OuterClass { public void print() {
System.out.println("outer");
}
private class InnerClass extends OuterClass {
public void print() {
System.out.println("inner");
}
}
public static void main(String[] args) {
OuterClass.InnerClass inner = new OuterClass().new InnerClass();
inner.print();
}
}
// 这里的变量指的是方法中的局部变量
public void methodA(int a, final int b) {
// 内部类Inner只能够访问方法methodA的final修饰的变量
// 和外部类的成员属性,
int c = 9;
final int d = 10;
class Inner {
int in;
public void methodInner() {
//c = a; // 报错
in = b; // 正确
//in = c; // 报错
in = d; // 正确
in = ou; // 正确
}
}
}
}
改为
l.ll llo = new l.ll();
就可以了
首先,局部内部类不一定非得是外部类的子类;其次,它定义在外部类的方法中。也就是说,“局部内部类只能访问它所处在的这个方法中final的局部变量”。那么为什么在局部式内部类中只能访问它所处在的这个方法中final的局部变量呢?这儿有个隐藏的细节,假设定义一个局部内部类:public class Outer{
public <公共类型> method(){
int a = 10;
final int b = 20;
class InnerLocal implements <公共类型>{ //局部式内部类。
//private final int b = 20; //编译器会自动将这个常量b复制为局部式内部类的属性(隐藏的细节)。
public void innerMethod(){
System.out.println(a); //报错,不允许访问名为a的变量。
System.out.println(b); //访问名为b的变量是可以的。
}
}
return new InnerLocal();
}
} 其实“method()”方法中的局部变量“b”只是做为副本被拷贝到“InnerLocal”局部内部类中做为它的属性,这是编译器做的,是不可见到的。那么如果当“method()”方法释放后,可是局部内部类的对象还在,而让这个对象去修改原来已释放的“method()”方法中的局部变量“b”是没有道理的,是不符合语法规范的。所以,在局部内部类只能访问它所处在的这个方法中final的局部变量。
不过:"那么如果当“method()”方法释放后,可是局部内部类的对象还在,而让这个对象去修改原来已释放的“method()”方法中的局部变量“b”是没有道理的,"----这句是不是打错了?应该是"局部变量'a'"吧?