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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于星星 中级黑马   /  2012-7-18 21:19  /  1435 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  我写了一个内部类,内部类里有一个方法,就是将字符串变成大写。
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());
        }
}

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

2 个回复

正序浏览
本帖最后由 黑马-王言龙 于 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修饰的局部变量。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
public class Outer {
        public static void main(String[] args) {
                new Test2().show();
        }
        
        public void show(){
                final String str1 = "adsfasdf";
                //这里没有将str2设为final,编译有错,为什么?
如果你的内部类不调用str2,此处编译不会报错;
如果你的内部类要调用str2,此处必须在str2的定义前加上final,否则编译报错。因为你定义的是局部内部类,局部内部类访问局部变量的规则就是只能访问被final修饰的局部变量

                //String str2 = "javaee";

                //System.out.println(new Inner().up());  为什么创建内部类对象的代码放在这里就报错?
因为程序时顺序执行的,你创建的内部类对象在内部类定义之前,程序执行到此是找不到这个内部类的,所以报错
                class Inner{
                        public String up(){
                                return str1.toUpperCase();
                        }
                };
                System.out.println(new Inner().up());
        }
}

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马