黑马程序员技术交流社区

标题: 局部内部类,访问局部变量 final关键字用法 [打印本页]

作者: 姿_`态    时间: 2014-6-14 12:45
标题: 局部内部类,访问局部变量 final关键字用法
本帖最后由 姿_`态 于 2014-6-16 17:24 编辑

/*不是说局部内部类访问局部变量,需要将局部变量定义为final的?为什么不定义也不报错啊 ,还有为什么要定义为final啊,是为了保证局部变量不会被修改?为什么以前的局部变量都不定义为final的
*/
class Outer
{

       void method()
        {
                int x=2;//正确
                //final int x=2;//正确
                class Inner
                {
                        //int x=2;//正确
                        //final int x=2;//正确
                        void function()
                        {
                                System.out.println(x);
                        }
                }
                new Inner().function();
        }
        
}

class InnerClassTest2
{
        public static void main(String[] args)
        {
                Outer o = new Outer();
                o.method();
        
        }
}


作者: Gaara33    时间: 2014-6-14 13:01
因为你用的是JDK1.8吧,这是新版本特性,你在int  x=2下面加上个x++,试试,你可以看看报的错误信息
作者: 姿_`态    时间: 2014-6-14 13:33
Gaara33 发表于 2014-6-14 13:01
因为你用的是JDK1.8吧,这是新版本特性,你在int  x=2下面加上个x++,试试,你可以看看报的错误信息 ...

哦,我知道了,他只是默认的前面会加一个final,尽管你自己没有加。
作者: 江夷    时间: 2014-6-14 15:52
      不定义也不会报错  应该是跟JDK8 有关系,
      另外还有为什么要定义为final啊,是为了保证局部变量不会被修改?
            这个定义为final是,因为局部变量是随着方法的消失而消失,而对象在堆内存中可能没有消失,如果对象没有消失,而变量消失了,是有问题的,所以用final修饰是为了提高局部变量的生命周期
作者: 姿_`态    时间: 2014-6-14 18:46
江夷 发表于 2014-6-14 15:52
不定义也不会报错  应该是跟JDK8 有关系,
      另外还有为什么要定义为final啊,是为了保证局部变 ...

定义为final可以延长生命周期? 不还是方法执行完就没有了?
作者: blackstones1    时间: 2014-6-14 19:03
看看 学习下
作者: 江夷    时间: 2014-6-14 21:42
姿_`态 发表于 2014-6-14 18:46
定义为final可以延长生命周期? 不还是方法执行完就没有了?

定义成常量后,常量是保存在常量池里,即使方法执行完后,也会继续存在
作者: See_the_sun    时间: 2014-6-14 22:49
因为final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期。
这个问题我记得回答过了。那个论坛帖子都有的
class InOut{
        String str = new String("123");
        public void method()
        {
                  int i =2;
                  final int a =1;
                 //System.out.println(a);
                  class Inner
                  {
                          public void sayHello()
                          {
                                 // Cannot refer to a non-final variable i inside an inner class defined in a different method
                                //System.out.println(i);
                                System.out.println(a);
                          }//end of Inner class
                  }
        }//end of method
}
在内部类中的sayHello方法。我们可以访问变量a,但是不能访问变量i
因为局部变量和对象的生命周期不一样。局部变量存于栈中,用完就释放。但是如果局部变量被内部类对象调用,调用完,局部释放。但是对象在内存中还存在(只是对象的引用没了),如果对象在再次调用该变量,就找不到了。所以要final.

是不是JDK1.8特性我不清楚。但是我知道如果内部类要调用必须要加final。不调用怎么会不可以定义呢。请大家注意说法
作者: 姿_`态    时间: 2014-6-15 10:23
江夷 发表于 2014-6-14 21:42
定义成常量后,常量是保存在常量池里,即使方法执行完后,也会继续存在 ...

哦哦,明白了
作者: yueyazhishang    时间: 2014-9-22 08:58
See_the_sun 发表于 2014-6-14 22:49
因为final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期。
这个问题我记得回答过了 ...

学习了。




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