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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dev 中级黑马   /  2012-7-4 17:01  /  2801 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

毕老师在视频中说过被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变量时必须显示初始化,
一旦初始化之后就再也不能修改了。


评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 分享知识,很给力!

查看全部评分

4 个回复

倒序浏览
本帖最后由 陆强强 于 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;
        }
}
回复 使用道具 举报
还有这样
        static final Integer x;
        static {
                x = 3;
        }
回复 使用道具 举报
车风波 发表于 2012-7-4 17:44
还有这样
        static final Integer x;
        static {

你这样也对,不过你这是类变量的实例化方式,
我上面说的是实例变量的实例化方式哦。
回复 使用道具 举报
楼主学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马