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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邓超军 中级黑马   /  2012-7-15 07:31  /  1686 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Outer
  2. {
  3.         int x = 3;

  4.         void method(final int a)
  5.         {
  6.                 final int y = 4;
  7.                 class Inner
  8.                 {
  9.                         void function()
  10.                         {
  11.                                 System.out.println(y);
  12.                         }
  13.                 }
  14.        
  15.                 new Inner().function();
  16.                
  17.         }
  18. }


  19. class  InnerClassDemo3
  20. {
  21.         public static void main(String[] args)
  22.         {
  23.                 Outer out = new Outer();
  24.                 out.method(7);
  25.                 out.method(8);//a不是常量吗?怎么还能再次被赋值?
  26.         }

  27. }
复制代码

7 个回复

倒序浏览
  1. 01.class Outer

  2. 02.{

  3. 03.        int x = 3;

  4. 04.

  5. 05.        void method(final int a)

  6. 06.        {

  7. 07.                final int y = 4;
  8.                     y = a;
  9.                      //加一个y = a;试一下
  10. 08.                class Inner

  11. 09.                {

  12. 10.                        void function()

  13. 11.                        {

  14. 12.                                System.out.println(y);

  15. 13.                        }

  16. 14.                }

  17. 15.        

  18. 16.                new Inner().function();

  19. 17.               

  20. 18.        }

  21. 19.}

  22. 20.

  23. 21.

  24. 22.class  InnerClassDemo3

  25. 23.{

  26. 24.        public static void main(String[] args)

  27. 25.        {

  28. 26.                Outer out = new Outer();

  29. 27.                out.method(7);

  30. 28.                out.method(8);//a不是常量吗?怎么还能再次被赋值?//你传的值根本就不是在同一个常量上,应该将a量赋值给y

  31. 29.        }

  32. 30.

  33. 31.}

复制代码
回复 使用道具 举报
本帖最后由 feigecal 于 2012-7-15 07:46 编辑

因为你的a是在内部 类中,内部类是一个局部内部类,a只在局部内有效,出了这个作用域会被释放,你用外部类的对象调用mehtod方法,给a赋值。调用一次赋一次,下次调用 的时候a已被释放,再说了调用的方法内没有用到a,所以不管是赋7还是8结果都是输出4。就算你方法内用到a,再次调用 时也是可以再赋值的,因为它只定义在局部内,会在调用 后被释放地
回复 使用道具 举报
out.method(8);//a不是常量吗?怎么还能再次被赋值?
因为a虽然是个常量,但你把它作为参数定义在method方法里,
就相当于在这个方法的局部有效,a开始没有值,第一次通过out.method(7);
调用method方法把7赋给了a,等程序执行完后,方法也在内存中释放了,a之前的值也没了
第二次再通过out.method(8);调用method方法把8赋给了a,相当于是个全新的a赋了个8
这个肯定是可以赋值的
如果要测试常量是否能被第二次赋值,可以看我下面的代码,把常量y再做自增
代码运行后会提示无法为最终y指定值
class Outer
{
        int x = 3;

        void method(final int a)
        {
                final int y = 4;
                class Inner
                {
                        void function()
                        {
                                                                y++;
                                System.out.println(y+a);
                        }
                }
        
                new Inner().function();
               
        }
}


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

}
因为y常量一定义就有值了,y++跟y在同一个方法范围内,就无法把y再次通过自增赋值了


QQ截图20120715074114.png (2.2 KB, 下载次数: 29)

QQ截图20120715074114.png
回复 使用道具 举报
本帖最后由 陈冲 于 2012-7-15 07:55 编辑
  1. class Outer
  2. {
  3.         int x = 3;

  4.         void method(final int a)
  5.         {
  6.                 final int y = 4;
  7.                 class Inner
  8.                 {
  9.                         void function()
  10.                         {
  11.                                 System.out.println(y);
  12.                         }
  13.                 }
  14.       
  15.                 new Inner().function();
  16.                
  17.         }
  18. }


  19. class  InnerClassDemo3
  20. {
  21.         public static void main(String[] args)
  22.         {
  23.                 Outer out = new Outer();
  24.                 out.method(7);
  25.                 out.method(8);//a不是常量吗?怎么还能再次被赋值?
  26.         }

  27. }
复制代码
final可以修饰类,方法,变量;
final修饰的类不可以被继承;
final修饰的方法不可以被覆盖;
final修饰的变量是一个常量,只能被赋值一次;
内部类只能访问final修饰的局部变量;

当调用method(int)方法时,才对a进行初始化;且a是局部变量,生命周期在method()方法结束时就结束;
所以
out.method(7);
out.method(8);
是两次不同的调用,每次调用时,都要对a重新进行初始化;

而你在method ()方法内部没用对a进行赋值,所以不存在再次赋值的问题。

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
final修饰局部变量,只保证,它一但被初始化就不能再局部内再改变。
你这里的method()方法一调用结束,a就会在内存中消失。
下次再调用method(),还是可以再次初始化变量a的
回复 使用道具 举报
周恺 中级黑马 2012-7-15 08:02:00
7#
你的final常量定义在method方法中,当method方法执行完毕退栈以后,所有在其中声明的变量都会销毁.

无论是常量还是变量,它在哪一个大括号里面声明,它的生命周期就随着那个大括号{}结束而结束.

点评

”无论是常量还是变量,它在哪一个大括号里面声明,它的生命周期就随着那个大括号{}结束而结束.” 总结的好。  发表于 2012-7-15 08:59
回复 使用道具 举报
韩伟 中级黑马 2012-7-15 09:04:18
8#
这个问题其实在视频中毕老师特别强调过的。首先,当系统调用out.method(7)时,method方法进栈执行,当方法执行完成之后,方法会在栈中被释放,那么变量a 就已经不存在了。当执行out.method(8)时,method方法就就再次进栈执行,同时有一个新的变量a产生。所以两次执行,变量a根本就不是一个变量,所以是没有问题的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马