黑马程序员技术交流社区

标题: 关于内部类的问题 [打印本页]

作者: 于星星    时间: 2012-7-18 21:19
标题: 关于内部类的问题
  我写了一个内部类,内部类里有一个方法,就是将字符串变成大写。
public class Outer {
        public static void main(String[] args) {
                new Test2().show();
        }
       
        public void show(){
                final String str1 = "adsfasdf";
                //这里没有将str2设为final,编译有错,为什么?
                //String str2 = "javaee";

                //System.out.println(new Inner().up());  为什么创建内部类对象的代码放在这里就报错?
                class Inner{
                        public String up(){
                                return str1.toUpperCase();
                        }
                };
                System.out.println(new Inner().up());
        }
}
作者: 黑马-王言龙    时间: 2012-7-18 21:37
本帖最后由 黑马-王言龙 于 2012-7-18 22:10 编辑

public class Demo2 {
    public static void main(String[] args) {
            new Demo2().show();
    }
   
    public void show(){
            final String str1 = "adsfasdf";
            //这里没有将str2设为final,编译有错,为什么?
            //1、这是局部内部类访问局部变量的问题,必须加final。关系到内存泄漏方面的问题。详见后面
            //String str2 = "javaee";

            System.out.println(new Inner().up());  //为什么创建内部类对象的代码放在这里就报错?
            //2、此show()方法执行到这一步时,内部类Inner还没有加载到内存中,是不能创建对象的。
            class Inner {
                    public String up(){
                            return str1.toUpperCase();
                    }
            };
            System.out.println(new Inner().up());
    }
}

1、从内存中看,当方法里的局部变量所在方法结束时,该变量即在栈内存中消失;而内部类其实是一个类,只有内存中对它的所有引用都消失后,
该内部类才"死亡",即内部类的生命周期可能比局部变量长,为了避免方法内的变量脱离方法而存在的现象发生(如果局部内部类能访问局部变量,那方法结束后,局部变量可能还在被局部内部类使用,这在多线程中很容易解释),于是java规定局部内部类不能访问一般的局部变量。但能访问被final修饰的局部变量。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2