黑马程序员技术交流社区

标题: final修饰变量时,初始化问题。 [打印本页]

作者: dev    时间: 2012-7-4 17:01
标题: final修饰变量时,初始化问题。
毕老师在视频中说过被final修饰的实例变量必须显示指定初始值,而且毕老师跟我们
讲的时候,是在定义final实例变量时就指定初始值的,这点我们都知道。可是除了这
种给final实例变量指定初始值之外,还有其他方式吗?
答案是:有的。我看书得知,除了毕老师给我们讲的这种之外,还有两种可以为final
实例变量初始化,那就是:
1、在非静态构造块中为final实例变量指定初始值
2、在构造函数中为final实例变量指定初始值


大家看看我以下的代码,你们应该就明白了。


class Demo{
        //定义final实例变量时赋初始值
        final String str1 = "HeiMa";
        final String str2;
        final String str3;
        //在构造块中为str2赋初始值
        {
                str2 = "itheima";
        }
        //在构造函数中为str3赋初始值
        public Demo(){
                this.str3 = "黑马程序员";
        }
}
public class FinalDemo{
        public static void main(String[] args){
                System.out.println(new Demo().str1);
                System.out.println(new Demo().str2);
                System.out.println(new Demo().str3);
        }
}


程序运行正常:
HeiMa
itheima
黑马程序员




综上所知,给final实例变量初始化的方式就有三种了。
以上三种,可以任意选择,但是一旦选择了其中一种为final初始化之后,
就不可以再用其他方式给其修改了。这点很好理解,再看看下面的代码:


class Demo02{
        final String str = "HeiMa";
        {
                str = "itheima";
        }
        public void Demo(){
                this.str = "黑马程序员";
        }
}
public class FinalDemo02{
        public static void main(String[] args){
                System.out.println(new Demo().str);
        }
}


编译程序会报错:无法为最终变量 str 指定值


这就是因为被final修饰的变量是最终变量,定义final变量时必须显示初始化,
一旦初始化之后就再也不能修改了。



作者: 陆强强    时间: 2012-7-4 17:42
本帖最后由 陆强强 于 2012-7-4 17:52 编辑

还有一种情况,当final修饰的是局部变量时可以通过方法随意传入赋值,但方法内部,X不能再更改。
class finals
{

        public static void main(String[] args)
        {
                finaltest  f=new finaltest();
                System.out.println(f.number(2));
                System.out.println(f.number(5));
                System.out.println(f.number(7));
                System.out.println(f.number(10));
               
        }
}
class finaltest
{

        public int number(int y)
        {
                final int x=y;
                //x=8;报错
                return x;
        }
}

作者: 车风波    时间: 2012-7-4 17:44
还有这样
        static final Integer x;
        static {
                x = 3;
        }
作者: dev    时间: 2012-7-4 17:57
车风波 发表于 2012-7-4 17:44
还有这样
        static final Integer x;
        static {

你这样也对,不过你这是类变量的实例化方式,
我上面说的是实例变量的实例化方式哦。
作者: 贾飞雨    时间: 2012-7-4 19:51
楼主学习了





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