final和static final的区别

package com.lzw;
import java.util.Random;
import static java.lang.System.out;

public class FinalStaticData {
	private static Random rand = new Random();//实例化一个Random类对象
	//随机产生0~10之间的随机数赋予定义为final的a1和a2
	private final int a1 = rand.nextInt(10);
	private static final int a2 = rand.nextInt(10);

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FinalStaticData fdata = new FinalStaticData();//实例化一个对象
		//调用定义为final的a1
		out.println("重新实例化对象调用a1的值:"+fdata.a1);
		//调用定义为static final的a2
		out.println("重新实例化对象调用a2的值:"+fdata.a2);
		//实例化另一个对象
		FinalStaticData fdata2 = new FinalStaticData();
		out.println("重新实例化对象调用a1的值:"+fdata2.a1);
		out.println("重新实例化对象调用a2的值:"+fdata2.a2);

	}

}

运行结果为
重新实例化对象调用a1的值:7
重新实例化对象调用a2的值:8
重新实例化对象调用a1的值:2
重新实例化对象调用a2的值:8

从结果可以看出,定义为final的常量不是恒定不变的,将随机数赋予定义为final的常量,可以做到每次运行程序时改变a1的值。
但是a2与a1不同,由于它被声明为static final形式,所以在内存中为a2开辟了一个恒定不变的区域,当再次实例化一个FinalStaticData对象时,仍然指向a2这块内存区域,所以a2的值保持不变。a2是在装载时被初始化,而不是每次创建对象时都被初始化,而a1会在重新实例化对象时被更改。

技巧:在Java中定义全局常量,通常使用public static final修饰,这样的常量只能在定义时被赋值

你可能感兴趣的:(JAVA)