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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马强 中级黑马   /  2012-4-13 11:25  /  2262 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Outer
{
        int x = 3;

        void method(final int a)
        {
                final int y = 4;    //内部类new对象的时候可以访问到自己类中的局部成员,而这里的y作为method方法中局部变量,为什么final后就可以访问
                class Inner
                {
                        void function()
                        {
                                System.out.println(y);
                        }
                }
       
                new Inner().function();
               
        }
}


class  InnerClassDemo3
{
        public static void main(String[] args)
        {
                Outer out = new Outer();
                out.method(7);
               
        }

}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

7 个回复

倒序浏览
  final int y = 4; 用final修饰后  y 就是一个常量
回复 使用道具 举报
   void method(final int a)
        {
                final int y = 4;    //内部类new对象的时候可以访问到自己类中的局部成员,而这里的y作为method方法中局部变量,为什么final后就可以访问
                class Inner
                {
                        void function()
                        {
                                System.out.println(y);
                        }
                }
        


内部类定义在类中的局部位置时,只能访问该局部被final修饰符所修饰的局部变量
回复 使用道具 举报
在内部类中用final修饰y做为常量来使用
final标记的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用
final标记的局部变量可以只声明不赋值,然后再进行一次性的赋值
回复 使用道具 举报
(1).内部类是外部类的一个成员,就像外部类的成员方法一样,所以内部类有权限访问外部类的所有成员,包括private的。
(2).内部类不能访问外部类方法中的局部变量,除非变量是final的(一般发生在方法中定义的内部类)。这是因为局部变量的生命周期原因。

回复 使用道具 举报
因为局部变量是存储在栈内存中的,使用完就会释放内存,而内部类创建的对象是存储在堆内存中的,只要该对象还有被指向的引用所使用的话,
就不会被垃圾回收机制回收,所以如果局部变量不被final修饰的话,那么就有 该局部变量所在的函数已经执行完毕了,它里面的内部类的对象
还有别的引用在使用,如果再调用该局部变量的话,就会出错,因为该局部变量已经被释放了。
而 定义成final后,该局部变量就会存储在常量池中,这时候该局部变量会一直存在,就不会出现以上所说的问题。
回复 使用道具 举报
马强 中级黑马 2012-4-13 12:43:29
7#
贠(yun)靖 发表于 2012-4-13 12:22
因为局部变量是存储在栈内存中的,使用完就会释放内存,而内部类创建的对象是存储在堆内存中的,只要该对象 ...

从内存上讲 就很透彻了 感谢
回复 使用道具 举报
本帖最后由 如梦初醒 于 2012-4-13 13:58 编辑

  
final在内存的方法区内
final,反射信息( 比如:Method , Field)和静态变量都在内存的方法区内被所有对象所共享


jvm内存分为三部分: 方法区  堆内存  栈内存
  


在学习反射的时候通常会说 Object.class 为一份字节码  其实这个所谓的字节码 就是内存方法区的 一个对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马