注明出处:参照参照《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