看了很多网上的资料,一般总结为:
局部内部类的生命周期可能比局部变量长,因为当方法里的局部变量所在方法结束时,该变量即在栈内存中消失;而内部类其实是一个类,只有内存中对它的所有引用都消失后,该内部类才"死亡"
可是:局部内部类的有效范围不也是函数内吗?局部内部类对象为什么会在函数结束后还存在呢?
劳烦大家解惑,有代码实例更好,不胜感激!

解决方案 »

  1.   

    如果你在方法外用到局部内部类,你的局部内部类必须继承自一个公共的外部类。
    给你一个例子:
    public class InnerClassDemo { public static void main(String[] args){
    Car c = new Car();
                   // 新加入一个发动机
    c.addEngine("big engine");

                   // 在上面那个方法返回后,发动机的实例仍然存在
    Part engine = c.getParts()[0]; //获取发动机的实例

    System.out.println(engine.getName()); // 打印发动机的名字
    }


    public static class Car{

    // 假设汽车有个实例数组变量装汽车的部件,现在只有一个发动机部件。
    private Part[] parts = new Part[1];

                   // 制造一个发动机,添加到部件里
    public void addEngine(String name){
                           // 为了演示,这里把传入的变量变成大写字母当成局部变量
    String capitalName = name.toUpperCase();

                          // 内部类定义一个发动机
    class Engine extends Part{ public Engine(){
    name = capitalName;
    }
    }

    parts[0] = new Engine();
    }

                  // 把发动机加入到零件数组
    public Part[] getParts(){
    return parts;
    }
    }

    public static class Part{
    protected String name;

    public String getName(){
    return this.name;
    }
    }
    }
      

  2.   

    如果局部内部类引用了局部变量, jvm会保留这个局部变量的副本在内部类的内存中。所以这个局部变量必须是不可变的。
      

  3.   


    最常用的是返回一个接口的实现类,比如 Arrays.asList() 就会在方法里声明一个内部类实现List接口,然后返回
      

  4.   


    capitalName必须是final的  ,不然会报错,为什么?final String capitalName = name.toUpperCase();
      

  5.   


    capitalName必须是final的  ,不然会报错,为什么?final String capitalName = name.toUpperCase();JDK 1.8 以后,局部变量只要实效上是final就可以不用声明为final, 但是1.8之前的JDK 局部变量必须声明为final 才可以在内部类里使用