java final关键字的理解与使用方法总结

注明出处:参照参照《Java从入门到精通》11.2章节

以下是对final变量的说明,之后还有final方法的说明

1、一般final关键字用于声明一个变量(常量也看作一个特殊的变量)。例如数学中的PI,E。


2、final关键字修饰变量时必须在声明时对其进行赋值。或者定义空白final,空白final必须在构造函数中,或构造函数执行之前(例如:构造代码块)对其赋值。

     final关键字修饰对象时,只能在声明是对其进行赋值。


3、final既可以修饰基本数据类型,也可以修饰对象引用。


4、我们通常认为final修饰的变量不能被改变,但这个不能被改变需要深入理解。

  • 4.1对实体(对象引用)进行修饰时,只能指向一个、声明时(没有其他)、固定的对象。
  • 4.2对常量进行修饰时,将不再能改变常量的值,一般final修饰的常量需要使用大写字母命名,且语义单词间用下划线进行连接。
  • 4.3对数组进行修饰时,不能对数组进行再次赋值。
  • 4.4前面说了修饰对象时,不能改变指向的对象,但指向对象本身的值可以改变(下面有例子)。
  • 4.5final定义的常量都是恒定不变的?NO。例如:final int a=Random.nextInt(10);// 对,没错,这是常量。
  • 4.6那么为了是一个常量真正做到不可改变,可以将常量生命为static final。(下面例子)
  • 4.7既然常量可以做到真正不能改变,那么在final对象前面加static是否不能改变对象本身的值的。不可行,依然可以改变。
下面使用程序说明final修饰变量可以出现的位置。

package cn.vicky.channel.aa;

public class TestStatic {
	
	// final成员变量不可更改
	final int VALUE_ONE = 1;
	
	// 在声明final成员变量时没有复制,称为空白final
	final int BLANK_FINALVALUE;
	
	// 空白final必须在构造函数中,或构造函数执行之前(例如:构造代码块)对其赋值
	public TestStatic() {
		BLANK_FINALVALUE = 1;
	}
	
	// 设置参数为final,不可以改变x的值
	int doIt(final int x) {
		x = x+1;// 这句编译错误
		return x+1;
	}
	
	// 局部变量定义为final,不可改变i的值
	public void doSomeThing() {
		final int i = 1;
		i++;// 这句编译错误
	}
}


为了深入的了解final和上面的理论知识,请仔细阅读下面的程序

package com.lzw;

import static java.lang.System.*;

import java.util.*;
class Test {
	int i = 0;
}

public class FinalData {
	static Random rand = new Random();
	private final int VALUE_1 = 9; // 声明一个final常量
	private static final int VALUE_2 = 10; // 声明一个final、static常量
	private final Test test = new Test(); // 声明一个final引用
	private Test test2 = new Test(); // 声明一个不是final的引用
	private final int[] a = { 1, 2, 3, 4, 5, 6 }; // 声明一个定义为final的数组
	private final int i4 = rand.nextInt(20);
	private static final int i5 = rand.nextInt(20);
	
	public String toString() {
		return i4 + " " + i5 + " ";
	}
	
	public static void main(String[] args) {
		FinalData data = new FinalData();
		// data.test=new Test();
		//可以对指定为final的引用中的成员变量赋值
		//但不能将定义为final的引用指向其他引用
		// data.value2++;
		//不能改变定义为final的常量值
		data.test2 = new Test(); // 可以将没有定义为final的引用指向其他引用
		for (int i = 0; i < data.a.length; i++) {
			// a[i]=9;
			// //不能对定义为final的数组赋值
		}
		out.println(data);
		out.println("data2");
		out.println(new FinalData());
		// out.println(data);
	}
}

package com.lzw;

import static java.lang.System.*;

import java.util.*;

public class FinalStaticData {
	private static Random rand = new Random(); // 实例化一个Random类对象
	// 随机产生0~10之间的随机数赋予定义为final的a1
	private final int a1 = rand.nextInt(10);
	// 随机产生0~10之间的随机数赋予定义为static final的a2
	private static final int a2 = rand.nextInt(10);
	
	public static void main(String[] args) {
		FinalStaticData fdata = new FinalStaticData(); // 实例化一个对象
		// 调用定义为final的a1
		out.println("重新实例化对象调用a1的值:" + fdata.a1);
		// 调用定义为static final的a2
		out.println("重新实例化对象调用a1的值:" + fdata.a2);
		// 实例化另外一个对象
		FinalStaticData fdata2 = new FinalStaticData();
		out.println("重新实例化对象调用a1的值:" + fdata2.a1);
		out.println("重新实例化对象调用a2的值:" + fdata2.a2);
	}
}

为了写太长,final方法和final类,另起一篇文章。

连接地址如下:http://blog.csdn.net/lidachao01/article/details/53791570


你可能感兴趣的:(java)