Java final字段的初始化详解

 
JAVA的final关键词可以用在三方面,一是字段,二是方法,三是类,本文主要讨论final字段的几种初始化方法.
首先用我个人通俗语言来解释一下final字段的意思,就是final如果初始化值,就不允许对它进行赋值运算,不允许再修改它的值了,JAVA术语叫final字段为常量.
注:本文的示例代码都没有写main方法,但代码都可以编译通过,自己可以再建一个类来进行测试.
第一种情况是最常用的,就是在声明一个常量,并初始化它的值.
public class Test{
final int i=0;        //在声明时就初始始常量的值.
}

第二种情况就是声明常量时,不初始化它的值,通过构造方法或块(关于块大家可以看我的”什么是java块”)来初始化.
1.通过构造方法来初始化.
public class Test{
final int i;    //声明时未初始化,如果常量不通过构造方法或块初始化会报错的
Test(){
i=1;    //通过默认的无参构造方法初始化i=1,
//如果只有默认的无参构造方法,这样每个对象的fianl常量都为一个值
}
//or
Test(int n){
i=n;    //通过构造方法重载,用有参的构造方法的参数来初始化常量为你想要的值
//这样每个对象的i属性可以为不同的值
}
}

2,通过块来初始化常量.
public class Test{
final int i;

//在class只打{},这样的格式语句称为块
{
i=1;    //这样初始化每一个对象的i属性都是1,以后不可以改它的值为其它
//不可以再在构造函数里初始化i的值,因为块已经把常量初始化了,再初始化就是修改它的值
}

}


为什么这样写可以呢,这个涉及到JAVA的成员初始化顺序,大家可以看我整理写的XXXX,或直接看thinkingInJava的第四章第四小节,网上有thinkingInJava的电子书下载.
3,初始化静态常量.
public class Test{
static final int i;
static{
i=1;
}
}

静态常量比较特别,不能通过构造方法或非静态块来进行初始化,从设计角度来考虑,如果可以通过构造方法或非静态块来进行初始化,那每new一个对象都会对静态的常量进行再一次的赋值操作,也就是说修改它的值,这样与常量不能修改的意思相冲突.
一个类的静态属性是所有对象公有的,而非静态属性是每一个对象私有的,所以我们只能用静态块对static常量初始化,或通过声明时就初始化,而非静态常量可以构造方法,块,声明时初始化三种初始化方法.
从成员的初始化顺序来考虑这个问题.当直接通过第一类名.属性或类名.方法名这样的方式访问,都会自动先调用static块,然后再调用静态属性,如果是直接调用静态方法,最后才进行静态方法的调用,而以后直接”类名.”访问时,都不会再调用static块,因为静态的是共享的,只用初始化一次.扩展一下,从这里大家想到为什么不可以在静态的方法里调用非静态成员属性不?因为当直接通过类名.方法名调用非静态的成员属性时,有可以成员属性没有初始化,是通过构造方法new时才初始化,这样就有可能导致空引用的存在.sun程序员为了避免这样的情况出现,只有规定静态方法不能调用非静态属性.

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值