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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 姿_`态 于 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();
        
        }
}

9 个回复

倒序浏览
因为你用的是JDK1.8吧,这是新版本特性,你在int  x=2下面加上个x++,试试,你可以看看报的错误信息
回复 使用道具 举报
Gaara33 发表于 2014-6-14 13:01
因为你用的是JDK1.8吧,这是新版本特性,你在int  x=2下面加上个x++,试试,你可以看看报的错误信息 ...

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

定义为final可以延长生命周期? 不还是方法执行完就没有了?
回复 使用道具 举报
看看 学习下
回复 使用道具 举报
江夷 中级黑马 2014-6-14 21:42:28
7#
姿_`态 发表于 2014-6-14 18:46
定义为final可以延长生命周期? 不还是方法执行完就没有了?

定义成常量后,常量是保存在常量池里,即使方法执行完后,也会继续存在
回复 使用道具 举报
因为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-14 21:42
定义成常量后,常量是保存在常量池里,即使方法执行完后,也会继续存在 ...

哦哦,明白了
回复 使用道具 举报
See_the_sun 发表于 2014-6-14 22:49
因为final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期。
这个问题我记得回答过了 ...

学习了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马