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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张成龙 中级黑马   /  2012-5-6 19:08  /  2188 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

定义在方法中的内部类能可以访问方法中的局部变量吗?

5 个回复

倒序浏览
可以访问被final修饰的,其他的不行
回复 使用道具 举报
内部类要访问包装类的变量 该变量必须被定义为final的
因为java中规定,内部类只能访问外部类中的成员变量,不能访问方法中定义的变量,如果要访问方法中的变量,就要把方法中的变量声明为final(常量)的,因为这样可以使变量全局化,就相当于是在外部定义的而不是在方法里定义的
回复 使用道具 举报
本帖最后由 天道酬勤 于 2012-5-6 19:40 编辑

       方法中定义的内部类不能访问方法中定义的局部变量,除非这个局部变量
被声明为final的。
        在方法中定义的局部变量在方法运行结束之后生命周期结束,不能
再被访问。方法中的内部类创建的对象有可能生命周期比这个局部变量长,
例如这个对象被作为返回值返回,那么方法运行结束之后还可以访问这个
对象。这时变量被销毁了,对象还在,如果在对象的某个方法内访问这个
变量就访问不到了。我们需要使用final修饰这个变量,被final修饰的变量
会一直存储在内存中,方法运行结束之后不被销毁。
回复 使用道具 举报
内部类(Inner Class),内部类共分为4种。
1.  静态内部类(static inner class):只能访问外部类的静态成员变量与静态方法,生成静态内部类对象的方式为:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
2..  成员内部类(member inner class):可以访问外部类的静态与非静态的方法与成员变量。生成成员内部类对象的方式为:
OuterClass.InnerClass inner = new OuterClass().new InnerClass();
3. 局部内部类(Local Inner Class):定义在方法当中,只能访问方法中声明的final类型的变量。 若想在局部内部类中访问外部类的成员变量,语法为:OuterClass.this.a;
4. 匿名内部类(Anonymous Inner Class):匿名内部类会隐式地继承一个父类或实现一个接口。
回复 使用道具 举报
本帖最后由 张小锋 于 2012-5-6 20:05 编辑

在方法中的类部内中只能调用方法中的fianl修饰的变量,其实是JAVA中的一个骗局之一,(也难怪有人说sun公司的程序员是个骗子,这即使其中骗局之一)
当调用局部的final变量时,它其实不是调用这个变量本身,而是它生成的一个副本而已,
如声明final   int   i   =   10,在内部类调用的不是i本身,而是它的一个COPY而已,只不过在java的编译器中中它给你做了实现,
为了不让人混淆,而且让人看起来用的就是i本身,所以要求i必须是final所修饰的变量才能使用。

如果要调用不是FINAL的变量就必须自己写一个实现Copy   i的代码:示例:
public class Reflex{
    public inte amethod(){
         int i = 10;   //此处并没有final修饰
         class method_InnerClass implements inte {
            public method_InnerClass(int i){
                 System.out.println(i);
            }
         }
          return new method_InnerClass(i);
     }
     public static void main(String[] args){
      Reflex inout= new Reflex();
         inte in=inout.amethod();
     }     
}
也就是说如果你声明为final的局部变量的i,当你在内部类要用的时候,编译器就会自动加上例如上面的代码,因为JVM不懂什么方法内部类的机制的,方法内部类它只是当它是一般的类来处理的。

点评

也就是说即使被final修饰,内部类也不能访问方法中的局部变量?  发表于 2012-5-13 09:26
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马