我做过一道关于内部类的题,感觉挺重要的,想跟大家分享一下,也想让大家看看,还有没有需要改正的地方.
public class Test2 {
public static void main(String[] args) {
//创建外部类对象
Outer o=new Outer();
//用外部类对象调用其method()方法
o.method();
}
}
//创建外部类
class Outer{
public void method(){
//用final修饰局部变量
final String s="i love java";
//如果是String s="i love java";则会报错
//创建内部类
class Inter{
public void printString(){
//用内部类的方法输出s
System.out.println(s);
}
}
//在外部类方法内创建内部类对象
Inter i=new Inter();
//用内部类对象调用其printString()方法
i.printString();
/*以下是做的解析:
* (1).如果是JDK8版本以后不需要加final可以直接访问.
* (2).如果是JDK8版本以前,
* 总体来说,内部类的生命周期可能会比局部变量的生命周期长.
* 首先,内部类,顾名思义,它是一个类所以它具有类的相关特性,只有在内存中对他的引用消失了才会死亡的内部类
* 其次,局部变量,存在于栈内存中,其生命周期是随着其所在作用域的消失而消失的;
* 再次,被final修饰的局部变量,局部变量的生命周期会延长,其不会因为语句块的结束而结束,还会长期存在。
* 第四,如果方法中的局部变量 s没有被 final关键字修饰,因为方法中的代码是由上而下顺序执行的,方法运行结束后,
* 局部变量就被销毁,这样Inter内部类去访问一个不存在的变量,肯定会报错的.
* 第五,解决的办法就是在局部变量前加上final,s在方法运行结束后不会被销毁,而是常驻在内存中直到 JVM退出
* 最后,这样内部类Inter就可以访问被final修饰的s了.
*
*/
}
} |
|