A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 2015天马行空 中级黑马   /  2015-11-4 13:49  /  453 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我做过一道关于内部类的题,感觉挺重要的,想跟大家分享一下,也想让大家看看,还有没有需要改正的地方.
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了.
                 *
                 */
               
        }
}

7 个回复

倒序浏览
可以让更多在这糊涂的同学看的更明白
回复 使用道具 举报
北极的男娃 发表于 2015-11-4 19:16
可以让更多在这糊涂的同学看的更明白

谢谢你,加油
回复 使用道具 举报
66666666666666666666
回复 使用道具 举报
局部变量加了final 生命周期和类一样吧?这个意思
回复 使用道具 举报
夕风秋凉 发表于 2015-11-5 00:21
局部变量加了final 生命周期和类一样吧?这个意思

你问的这个问题,我还真不敢确定,你在问问别人吧
回复 使用道具 举报

谢谢,祝你好运
回复 使用道具 举报
2015天马行空 发表于 2015-11-5 12:50
你问的这个问题,我还真不敢确定,你在问问别人吧

兄弟 请看代码 你这个说的很好理解  如果我代码这样写 (方法生命周期和那个对象生命周期就一样了)
public class Outer {
        int b=1;
        void A(){
                 int x=2;
                class Inner{
                void B(){
                        System.out.println(x);
                }
        }
                Inner c1=new Inner();
                c1.B();    /*在这里 外部建立外部类对象后调用A方法,会建立内部类对象再去访问B方法,此时A             方法没结束对吧,也就是还没释放,局部变量并没有消失,就能访问出来对不,可是代码还是编译出错,求    解为啥**/
        }
       
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马