【30】java里的final变量

A:final的基本属性

 1 class Value{
2 int i = 1;
3 }
4
5 public class FinalData {
6
7 final int a = 9;//编译阶段即为常数,该值会被封装到需要的计算过程中
8 static final int b = 99;
9
10 public static final int c = 39;
11 final int d = (int)(Math.random()*20);//运行阶段,首次被赋值后即为常数
12 static final int e = (int)(Math.random()*20);
13
14 Value aValue = new Value();
15 public final Value bValue = new Value();
16 static final Value cValue = new Value();
17
18 final int[] intArray = {1,2,3,4,5,6};
19
20 public void print(String id){
21 System.out.println(id + ": " + "d = " + d + ", e = " + e);
22 }
23
24 public static void main(String args[]){
25 FinalData finalData = new FinalData();
26
27 //finalData.a ++; //由于a是基本数据类型,并且已指定数值,即为基本数据类型的常数,不可被改变
28
29 finalData.bValue.i ++;//bValue是常句柄,即它所指向的对象不可改变,但它指向的对象并非常量,所以对象的值可以改变
30
31 finalData.aValue = new Value();//aValue句柄不是常量,所以可以让其指向新的对象
32
33 for(int i = 0;i < finalData.intArray.length;++i){
34 finalData.intArray[i] ++;//intArray这个数组句柄是常量,但其内部包含的所有对象都不是常量,故其值可以改变
35 }
36
37 finalData.print("finalData");
38
39 System.out.println("Create a new FinalData");
40
41 FinalData finalData2 = new FinalData();
42
43 finalData.print("finalData");
44
45 finalData2.print("finalData2");
46 }
47 }
48 //基本数据类型,非基本数据类型,在用某些关键词修饰时,其表现是不同的,我们可以认为基本数据类型没有句柄。
49 //用关键词修饰时,基本数据类型被修饰的就是其本身,非基本数据类型被修饰的是其句柄(形参除外)。
50
51 //另外要注意的一点是e的值,它在finalData和finalData2中的值是相同的,因为它在finalData创建时被赋予了初值,
52 //且其被final修饰,static又决定其值属于类而非对象,所以其值不会被改变。

 B:空白fianl

 1 class SomeObj{}
2
3 public class BlankFinal {
4
5 final int i = 0;//正常的final变量
6 final int j;//空白final
7 final SomeObj obj;//空白final句柄
8
9 //static final int x; //不允许存在空白的static final
10
11 //声明:空白final必须在构造函数中被初始化
12
13 public BlankFinal(){
14 j = 9;
15 obj = new SomeObj();
16 }
17
18 public BlankFinal(int x){
19 j = x;
20 obj = new SomeObj();
21 }
22
23 /**
24 * @param args
25 */
26 public static void main(String[] args) {
27
28 BlankFinal final1 = new BlankFinal();
29 BlankFinal final2 = new BlankFinal(6);
30
31 System.out.println("final1.j = " + final1.j + " final2.j = " + final2.j);
32 }
33
34 }
35 //空白final相对灵活,他允许不同的对象拥有不同的final值,但final在使用是必须保证已被初始化

C,当final修饰的时函数的形参是,真正被修饰的是对象,句柄在这里没有作用。

你可能感兴趣的:(final)