java之final的各种用法

转载请注明出处

http://blog.csdn.net/pony_maggie/article/details/44317505


作者:小马


final类型的成员变量



先看一段代码,

class Value
{
	int i = 1;
}

public class FinalData 
{

	final int i1 = 9;
	static final int VAL_TWO = 99;
	public static final int VAL_THREE = 39;
	final int i4 = (int)(Math.random()*20);
	static final int i5 = (int)(Math.random()*20);
	final int i6;
	
	Value v1 = new Value();
	final Value v2 = new Value();
	static final Value v3 = new Value();
	//arrays
	final int[] a = {1, 2, 3, 4, 5, 6};
	
	public FinalData()
	{
		i6 = 0;
	}
	
	public void print(String id)
	{
		System.out.println(id + ": " + "i4 = " + i4 +
				", i5 = " + i5);
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		FinalData fd1 = new FinalData();
		//fd1.i1++; //error: can't change value
		fd1.v2.i++; //object is not constant.
		fd1.v1 = new Value(); // ok, not final
		for(int i = 0; i < fd1.a.length; i++)
		{
			fd1.a[i]++;//object is not constant.
			//fd1.v2 = new Value(); // can't change reference.
			//fd1.v3 = new Value(); // can't change reference.
			//fd1.a = new int[3];
			
			fd1.print("fd1");
			System.out.println("creating new finalData");
			FinalData fd2 = new FinalData();
			fd1.print("fd1");
			fd2.print("fd2");
			
		}

	}

}


输出结果:
fd1: i4 = 0, i5 = 11
creating new finalData
fd1: i4 = 0, i5 = 11
fd2: i4 = 18, i5 = 11
fd1: i4 = 0, i5 = 11
creating new finalData
fd1: i4 = 0, i5 = 11
fd2: i4 = 9, i5 = 11
fd1: i4 = 0, i5 = 11
creating new finalData
fd1: i4 = 0, i5 = 11
fd2: i4 = 10, i5 = 11
fd1: i4 = 0, i5 = 11
creating new finalData
fd1: i4 = 0, i5 = 11
fd2: i4 = 7, i5 = 11
fd1: i4 = 0, i5 = 11
creating new finalData
fd1: i4 = 0, i5 = 11
fd2: i4 = 1, i5 = 11
fd1: i4 = 0, i5 = 11
creating new finalData
fd1: i4 = 0, i5 = 11
fd2: i4 = 4, i5 = 11


i1 是final,编译时就确定,所以不能更改。VAL_TWO和VAL_THREE是同样的道理,除此之外它还是static,意味着它是属于类本身,还不是实例。

i4和i5表明,final类型的变量值不一定要在编译时确定,运行时赋值也是OK的。 它俩的区别还在于,i4的值每次运行都不同(因为是随机数),而i5则是一样的(都是第一次获取到的随机数),这是static在起作用,它让i5只被赋值一次。

另外,关于i5,还有一点值得关注,就是fd2中的i5和fd1一样,这是因为 只初始化一次的机制是针对整个程序加载而言,而不是实例的创建。i6表明final变量在定义时可以不用马上初始化,但是使用前一定要,所以编译器会提示你在构造函数里初始化,否则会报错。

v1 是普通的类引用变量,可以随意更改。v2和v3因为用了final修饰,它们的引用不能更改。

fd1.v2.i++
这一行表明,对于v2只是引用不能更改,但是它的值还是可以改的,也就是说,reference是常量,object不是。同样的原量也适用于数组a,毕竟数组在java里也是引用。
 
 


未完待续。


                                                                          

你可能感兴趣的:(java,static,final,常量)