黑马程序员技术交流社区

标题: finall的问题 [打印本页]

作者: 汪小照    时间: 2012-10-21 15:31
标题: finall的问题
本帖最后由 汪小照 于 2012-10-23 17:11 编辑

被final修饰的变量可以是成员变量,也可以是局部变量,但是不是被finall修饰的变量只能赋值一次,因为在听毕老师讲课的时候他说被final修饰的变量只能赋值一次,
而在看张老师的视频时发现被final修饰的变量在for循环中被赋了无数次都没出错。
作者: 给生活加点料    时间: 2012-10-21 15:40
用final修饰的变量,的确是只赋值一次,不可以在改变。  
但在for循环里的可以被无数次原因是,在for循环里的属于局部变量,所以是可以不断改变的。 不知道你明白否!
作者: 彭旭文    时间: 2012-10-21 15:43
有这回事?一般情况被final修饰的变量只能赋值一次后不能改变了!FOR循环里面的局部变量真的被final修饰了吗?循环里用的是局部变量还是全局变量?请把程序打出来,大家探讨下...谢谢!{:soso_e100:}
作者: 唐进    时间: 2012-10-21 15:48
它估计是把局部变量用final修饰是给for循环的内部类来访问,因为非静态方法和里面的参数都是放在栈内存中,执行一遍就会被回收,故可以重新赋值,这是我的理解
作者: 李建强    时间: 2012-10-21 16:00
我虽然没记得哪次视频是这样,
但是final确实只能被赋值一次,之后final修饰的引用就不能改变了。
注意,是引用。

比如这个引用指向了一个对象,这个对象是可以改变的。
但是你不能把这个引用指向另一个对象。
作者: 汪小照    时间: 2012-10-21 19:59
嗯,明白来了你说的了
作者: 任雷彬    时间: 2012-10-21 20:58
被final修饰的变量只能被赋值一次,就以常量的形式存在。但是被final修饰的对象,对象的引用不能指向新的对象,但是他的对象可以被改变。

class Demo
{
        int i =5;
}

class FinalDemo
{
      Demo  a = new Demo();
       public void add(final Demo a)   //final修饰对象a      
{
        //a = new Demo();   //报错,对象引用a不能指向新的对象
        int i = a.i+1;        //对象a中成员变量i增加1
}
}
作者: 汪小照    时间: 2012-10-22 10:28
任雷彬 发表于 2012-10-21 20:58
被final修饰的变量只能被赋值一次,就以常量的形式存在。但是被final修饰的对象,对象的引用不能指向新的对 ...

被final修饰的对象,对象的引用不能指向新的对象,但是他的对象可以被改变 这句话我很认同,
但是被final修饰的变量只能赋值一次,那为什么下面的代码不报错呢?
public class FinalTest {
        public static void main(String [] args)
        {
                for(int x=0;x<=10;x++)
                {
                        final int y =x;
                        System.out.println(y);
                }
        }

}
作者: 任雷彬    时间: 2012-10-22 12:01
汪小照  发表于 2012-10-22
被final修饰的对象,对象的引用不能指向新的对象,但是他的对象可以被改变 这句话我很认同,
但是被final修饰的变量


你在for循环中定义的局部变量 y,被final修饰是固定不变的,但是
赋给 y的是局部变量x的变量名,x是不变的,但是x的值随着循环在变化。

final int y = x;// x变量名不变,但是随着循环for(int x=0;x<=10;x++)
                     //          x变量的值在变化的

final  int y = 5;//局部变量 y 初始化为具体实际值,则 y 就以常量存在。
    试比较一下final int y =x;与 final int y = 5区别吧。




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