刚学内部类,这个东西真的很绕,不好理解,比如下面这个:"局部内部类只能访问父方法中的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);
}
}

}

解决方案 »

  1.   

    不一定是的
    继承的话在类声明后面加上 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();
    }
    }
      

  2.   

    局部内部类指的是方法里面的内部类public class InnerClazz { private int ou = 0; // 局部内部类只能访问父方法中的final变量
    // 这里的变量指的是方法中的局部变量
    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;  // 正确
    }
    }
    }
    }
      

  3.   

     将l.ll llo=lo.new ll();
    改为
    l.ll llo = new l.ll();
    就可以了
      

  4.   

        “局部内部类只能访问父方法中的final变量”这句话不难理解。
        首先,局部内部类不一定非得是外部类的子类;其次,它定义在外部类的方法中。也就是说,“局部内部类只能访问它所处在的这个方法中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的局部变量。
      

  5.   

    其实楼主不必死钻内部类,有些搞Java开发的人他一辈子都没用过内部类照样每月都能拿到5K以上。Java中的内部类个人感觉挺鸡肋的,没有吧不显Java语言的档次,有吧又没什么用……
      

  6.   

    学习了!
    不过:"那么如果当“method()”方法释放后,可是局部内部类的对象还在,而让这个对象去修改原来已释放的“method()”方法中的局部变量“b”是没有道理的,"----这句是不是打错了?应该是"局部变量'a'"吧?