Java final属性

基本属性

被final修饰的属性不可变。这种不可变的属性,我们可以称之为“常量”。这种常量大体上有两种表现形式。先来看下面的代码:

public class FinalAttribute { private final String attribute_a = "chengfan"; public void test(){ //attribute_a = "zhangbingxiao"; 不可以这样写 }
}

这是最基本的final属性,在定义的时候初始化,并且在编译期值就已经确定,不能修改。

其他属性

public class FinalAttributeB { private final String attribute_b; public FinalAttributeB(String attribute_b){ this.attribute_b = attribute_b;
    } public void test(){ //attribute_b = "zhangbingxiao"; } public void test(String attribute_b){ //this.attribute_b = attribute_b; }
}

这种final属性在编译期间是无法确定属性值的,只有运行的时候才可以确定(通过构造器初始化属性)。同样,属性一经初始化后就不可以改变,所以下面的test方法都无法修改final属性。

属性初始化

public class FinalAttributeB { private final String attribute_b;

    {
        attribute_b = "zhangbingxiao";
    } static { //attribute_b = "zhangbingxiao";  } //    public FinalAttributeB(String attribute_b){ //        this.attribute_b = attribute_b; //    } }

通过构造代码块初始化final属性也是可以的,但是这样就不能再使用构造函数初始化了,因为构造代码块先于构造函数执行。而final属性只能且必须初始化一次。

你可能发现了,我写了静态代码块,但是注释掉了。没错,因为静态代码块只能初始化静态属性,我们在文章最后再讨论它。这种不在定义时初始化,而使用构造函数初始化的,也称为空白final变量。它为final在使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。

那除了构造函数,有没有别的方式也达到编译时初始化呢?当然有,比如你使用Random来初始化:

private final int attribute_c = new Random().nextInt();

这样你只有在运行的时候,才知道属性值是多少。


精彩推荐