看了很多网上的资料,一般总结为:
局部内部类的生命周期可能比局部变量长,因为当方法里的局部变量所在方法结束时,该变量即在栈内存中消失;而内部类其实是一个类,只有内存中对它的所有引用都消失后,该内部类才"死亡"
可是:局部内部类的有效范围不也是函数内吗?局部内部类对象为什么会在函数结束后还存在呢?
劳烦大家解惑,有代码实例更好,不胜感激!
局部内部类的生命周期可能比局部变量长,因为当方法里的局部变量所在方法结束时,该变量即在栈内存中消失;而内部类其实是一个类,只有内存中对它的所有引用都消失后,该内部类才"死亡"
可是:局部内部类的有效范围不也是函数内吗?局部内部类对象为什么会在函数结束后还存在呢?
劳烦大家解惑,有代码实例更好,不胜感激!
解决方案 »
- 0.5的n次幂。如何能够快速的计算。
- 内存地址问题
- java Class问题 请高手帮忙
- [log4j]按天滚动log文件,如何使当天的log文件达到一定size后再滚动文件?(即DailyRollingFileAppender和RollingFileAppender混合的效果)
- 一个子类只能有一个父类吗
- 请教高手如何学习Corba
- 中文问题:utf-8编码转成GBK,因为位数不同而产生字符丢掉问题!!
- 喂~~~~~~~~有人能给我详细回答吗?
- 我这用freejava编译简单的HelloWorld.java总是没反应,它也没有任何提示,jdk路径也设好了,jdk是不是非要安装的才行,我的JDK1.3不是安装的,是从JBuilder5直接复制到d:\jdk1.3,谁能告诉我是怎么回事??
- 关于java视频流获取与播放的操作
- 新手求大神指导指导一些java基础的东西
- 关于javaagent拦截不到File类的问题
给你一个例子:
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;
}
}
}
最常用的是返回一个接口的实现类,比如 Arrays.asList() 就会在方法里声明一个内部类实现List接口,然后返回
capitalName必须是final的 ,不然会报错,为什么?final String capitalName = name.toUpperCase();
capitalName必须是final的 ,不然会报错,为什么?final String capitalName = name.toUpperCase();JDK 1.8 以后,局部变量只要实效上是final就可以不用声明为final, 但是1.8之前的JDK 局部变量必须声明为final 才可以在内部类里使用