对于原始类型,final使数值恒定不变,而用于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法对它进行改变以指向另一个对象。然而,对象其自身却是可以被修改的,Java并未提供使任何对象恒定不变的途径。(但你可以自己编写类以取得使对象恒定不变的效果。)这一限制同样适用数组,它也是对象。
下面是一个用以说明final数据成员的示例:
//: c06:FinalData.java
// The effect of final on fields.
import com.bruceeckel.simpletest.*;
import java.util.*;
class Value {
int i; // Package access
public Value(int i) {
this.i = i;
}
}
public class FinalData {
private static Test monitor = new Test();
private static Random rand = new Random();
private String id;
public FinalData(String id) {
this.id = id;
}
// Can be compile-time constants:
private final int VAL_ONE = 9;
private static final int VAL_TWO = 99;
// Typical public constant:
public static final int VAL_THREE = 39;
// Cannot be compile-time constants:
private final int i4 = rand.nextInt(20);
static final int i5 = rand.nextInt(20);
private Value v1 = new Value(11);
private final Value v2 = new Value(22);
private static final Value v3 = new Value(33);
// Arrays:
private final int[] a = { 1, 2, 3, 4, 5, 6 };
public String toString() {
return id + ": " + "i4 = " + i4 + ", i5 = " + i5;
}
public static void main(String[] args) {
FinalData fd1 = new FinalData("fd1");
// ! fd1.VAL_ONE++; // Error: can't change value
fd1.v2.i++; // Object isn't constant!
fd1.v1 = new Value(9); // OK -- not final
for (int i = 0; i < fd1.a.length; i++)
fd1.a[i]++; // Object isn't constant!
// ! fd1.v2 = new Value(0); // Error: Can't
// ! fd1.v3 = new Value(1); // change reference
// ! fd1.a = new int[3];
System.out.println(fd1);
System.out.println("Creating new FinalData");
FinalData fd2 = new FinalData("fd2");
System.out.println(fd1);
System.out.println(fd2);
monitor.expect(new String[] { "%% fd1: i4 = \\d+, i5 = \\d+",
"Creating new FinalData", "%% fd1: i4 = \\d+, i5 = \\d+",
"%% fd2: i4 = \\d+, i5 = \\d+" });
}
} // /:~
//: c06:BlankFinal.java
// "Blank" final fields.
class Poppet {
private int i;
Poppet(int ii) {
i = ii;
}
}
public class BlankFinal {
private final int i = 0; // Initialized final
private final int j; // Blank final
private final Poppet p; // Blank final reference
// Blank finals MUST be initialized in the constructor:
public BlankFinal() {
j = 1; // Initialize blank final
p = new Poppet(1); // Initialize blank final reference
}
public BlankFinal(int x) {
j = x; // Initialize blank final
p = new Poppet(x); // Initialize blank final reference
}
public static void main(String[] args) {
new BlankFinal();
new BlankFinal(47);
}
} // /:~
你被强制在数据成员的定义处或者是每个构造器中用表达式对final进行赋值。这正是final数据成员在使用前总是被初始化的原因所在。
分享到:
相关推荐
电话号码查询系统_final 数据结构课程设计 包括实验报告(英文的)
FinalData数据恢复
FinalData数据恢复 数据恢复 实现简单的数据恢复
finalData是一款高效的数据恢复软件。FinalData可以很容易地从格式化后的文件和被病毒破坏的文件恢复。甚至在极端的情况下,如果目录结构被部分破坏也可以恢复,只要数据仍然保存在硬盘上。亲测,绝对好用,无限制。
FinalData数据修复 FinalData数据修复
FinalData 数据恢复 硬盘数据恢复
资源中有acm icpc world final 2017年世界总决赛除D,G题的数据
FinalData 使用这一项原则复原数据, 甚至那之后使再循环箱柜已经被倒空。 除此之外, FinalData 容易地能够复原划除文件和被病毒损害的硬盘数据或被意外的 格式。 甚至在极端的情况, 在目录结构被部份地损害的地方, ...
数据恢复软件FINALDATA数据恢复软件FINALDATA
finaldate20数据恢复工具,从国外原网站获取,经使用后非常满意
Finaldata数据恢复软件是一款功能强大的专业硬盘数据恢复软件;能够快速恢复误删除的数据、格式化的数据、恢复突然消失的数据以及提示未格式化、磁盘分区丢失、分区删除、磁盘为RAW、磁盘分区大小为0等情况;甚至在...
超级数据恢复工具的特性功能包括:支持FAT16/32和NTFS,恢复完全删除的数据和目录,恢复主引导扇区和FAT表损坏丢失的数据,恢复快速格式化的硬盘和软盘中的数据,恢复CIH破坏的数据,恢复硬盘损坏丢失的数据,通过...
超级数据恢复工具的特性功能包括:支持FAT16/32和NTFS,... 另外,FinalData可以很容易地从格式化后的文件和被病毒破坏的文件恢复。甚至在极端的情况下,如果目录结构被部分破坏也可以恢复,只要数据仍然保存在硬盘上。
FinalData数据恢复软件 旅之星移动硬盘OEM版 随旅之星移动硬盘带的 简单好用,数据误删除 想恢复 一点就行
FinalData数据恢复软件免安装版本。恢复速度快,支持文件分类恢复。
FINALDATA 数据恢复软件.rar
FinalData深度超强硬盘数据恢复专家 在Windows环境下删除一个文件,只有目录信息从FAT或者MFT(NTFS)删除。这意味着文件数据仍然留在你的磁盘上。所以,从技术角度来讲,这个文件是可以恢复的。FinalData就是通过...
FinalData破解版是一款高效的数据恢复软件。FinalData破解版可以很容易地从格式化后的文件和被病毒破坏的文件恢复。甚至在极端的情况下,如果目录结构被部分破坏也可以恢复,只要数据仍然保存在硬盘上。
数据恢复FinalData-v2.01绿色版 好用