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();
这样你只有在运行的时候,才知道属性值是多少。
版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。