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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 章成 黑马帝   /  2011-7-19 15:29  /  3010 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public  void   m(){
        int x=0;
        class Inner{
                public void n(){
                system.out.ptintln(x);
                }
        }
}
方法的内部类不能调用方法中的x,要加fianl。自己对方法中的内部类不是很清楚,能不能帮忙解释下为什么?

评分

参与人数 1技术分 +1 收起 理由
admin + 1 为什么呢?等待马友们的回答

查看全部评分

5 个回复

倒序浏览
黑马网友  发表于 2011-7-19 15:57:30
沙发
1、在一个方法内部定义一个类通常叫做局部内部类,由于在方法内部有效,所以不能使用访问修饰符修饰
2、对于局部成员(包括局部变量和局部内部类),上一级程序单元都是方法,所以用static修饰没有意义,所以不能用static修饰
  因为static修饰的要和类相关的,
3、由于内部类在编译的时候我们看一下字节码的命名就会知道;外部类名字.内部类名字。这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用
4、也许你这方法结束了那么这个常量就没有了。而使用final修饰符不仅会保持对象的引用不会改变,而且编译器还会持续维护这个对象在回调方法中的生命周期.
回复 使用道具 举报
给一个很直白的解释:
    因为局部变量是临时的,方法一旦执行完毕即被释放,而内部类是要在java虚拟机中动态运行的程序,它的生命周期不随方法的结束而结束 。用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期。
    很简单吧!
[ 本帖最后由 毕仁杰 于 2011-07-19  16:20 编辑 ]

评分

参与人数 1技术分 +1 收起 理由
技术测试刘老师 + 1 简单

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-20 00:13:55
板凳
1、因为用final定义的局部变量相当于一个常量,它的生命周期超出方法运行的生命周期;
2、局部变量的生命周期是:当该方法被调用时,该方法的局部变量在栈中被创建,当方法调用结束的时候, 退栈,这些局部变量全部死亡;
3、而内部类对象的生命周期是:与其他的类一样,当创建一个内部类对象后,只有当没有其他人再引用它的时候,它才死亡。
4、所以,有可能会出现这样的情况,方法调用已经结束了(局部变量死亡),内部类对象还存在。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-20 09:02:35
报纸
内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,自己内部的方法调用的实际是自己的属性而不是外部类方法的参数。

评分

参与人数 1技术分 +2 收起 理由
admin + 2 新人新气象,先加分

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-20 09:33:20
地板
1.弄明白这个变了的作用域,(上面解释的很清楚了)
2.、使用方法,一个是加final  另种是在使用的是加上外部类名,再加this   比如: System。out。println(m.this.x);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马