黑马程序员技术交流社区

标题: 关于final [打印本页]

作者: 马强    时间: 2012-4-13 11:25
标题: 关于final
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);
               
        }

}

作者: 如梦初醒    时间: 2012-4-13 11:28
  final int y = 4; 用final修饰后  y 就是一个常量
作者: 孙国军    时间: 2012-4-13 11:34
   void method(final int a)
        {
                final int y = 4;    //内部类new对象的时候可以访问到自己类中的局部成员,而这里的y作为method方法中局部变量,为什么final后就可以访问
                class Inner
                {
                        void function()
                        {
                                System.out.println(y);
                        }
                }
        


内部类定义在类中的局部位置时,只能访问该局部被final修饰符所修饰的局部变量
作者: τ、高童鞋ゝ    时间: 2012-4-13 12:13
在内部类中用final修饰y做为常量来使用
final标记的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用
final标记的局部变量可以只声明不赋值,然后再进行一次性的赋值

作者: 刘占月    时间: 2012-4-13 12:19
(1).内部类是外部类的一个成员,就像外部类的成员方法一样,所以内部类有权限访问外部类的所有成员,包括private的。
(2).内部类不能访问外部类方法中的局部变量,除非变量是final的(一般发生在方法中定义的内部类)。这是因为局部变量的生命周期原因。


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

从内存上讲 就很透彻了 感谢
作者: 如梦初醒    时间: 2012-4-13 13:45
本帖最后由 如梦初醒 于 2012-4-13 13:58 编辑

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


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


在学习反射的时候通常会说 Object.class 为一份字节码  其实这个所谓的字节码 就是内存方法区的 一个对象





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