11.2 final变量

1、概述
  a、final关键字可用于变量声明,一旦该变量设定,就不可以在改变该变量的值。通常,由final定义的变量为常量。
  b、final关键字定义的变量必须在声明是对其进行赋值操作。
  c、final出了可以修饰基本数据类型的常量,还可以修饰对象引用。
  d、在被定义为final的常量时需要使用大写字母命名,并且中间使用下划线进行连接,这是Java中的编码规则。
  e、在Java中定义全局变量,通常使用public static final修饰,这样的常量只能在定义时被赋值。

例11.4

 1 package com.lzw;
 2 import static java.lang.System.out;
 3 import java.util.Random;
 4 
 5 class Test{
 6     int i = 0;
 7 }
 8 
 9 public class FinalData {
10     static Random rand = new Random();
11     private final int VALUE_1 = 9; //声明一个final常量
12     private static final int VALUE_2 =10;  //声明一个final、static常量
13     private final Test test = new Test();  //声明一个final引用
14     private Test test2 = new Test();  //声明一个不是final的引用
15     private final int[] a = {1,2,3,4,5,6};   //声明一个定义为final的数据
16     private final int i4 = rand.nextInt(20);
17     private static final int i5 = rand.nextInt(20);
18     public String toString() {
19         return i4 + " " + i5 + " ";
20     }
21     
22     //主方法
23     public static void main(String[] args) {
24         FinalData data = new FinalData();
25         //可以对指定为final的引用中的成员变量赋值,但不能将定义为final的引用指向其它引用
26 //        data.test = new Test();
27 //        data.VALUE_2++;
28         
29         //不能改变定义为final的常量值
30         data.test2 = new Test();
31         
32         for(int i=0;i<data.a.length;i++) {
33             //不能对定义为final的数组赋值
34 //            a[i] = 9;   
35         }
36         
37         out.println(data);
38         out.println("data2");
39         out.println(new FinalData());
40         out.println(data);
41     }
42 }
View Code

2、通常一个被定义为final的对象引用只能指向唯一一个对象,不可以将它在指向其它对象,但是一个对象本身的值却是可以改变的,那么为了使一个常量真正做到不可更改,可以将常量声明为static final。

例11.5

 1 package com.lzw;
 2 import java.util.Random;
 3 import static java.lang.System.out;
 4 
 5 public class FinalStaticData {
 6     private static Random rand = new Random();   //实例化一个Random类对象
 7     private final int a1 = rand.nextInt(10);      //随机产生0~10之间的随机数赋予定义为final的a1
 8     private static final int a2 =rand.nextInt(10);
 9     
10     //主方法
11     public static void main(String[] args) {
12         //实例化一个对象
13         FinalStaticData fdata = new FinalStaticData();  
14         out.println("重新实例化调用a1的值:" + fdata.a1);  //调用定义为final的a1
15         out.println("重新实例化调用a2的值:" + fdata.a2);  //调用定义为static final的a2
16         
17         //实例化另外一个对象
18         FinalStaticData fdata2 = new FinalStaticData(); 
19         out.println("重新实例化调用a1的值:" + fdata2.a1);  //调用定义为final的a1
20         out.println("重新实例化调用a2的值:" + fdata2.a2);  //调用定义为static final的a2
21     }
22             
23 }
View Code

原文地址:https://www.cnblogs.com/studycode/p/9534866.html