final关键字之final Data
概括来说final的含义为:This cannot be changed即不能被改变。
下面就data,methods以及class三个方面来进行说明。
final data
with a primitive ,final makes value a constant...
final修饰基本数据类型的变量时,表示的是一个常量即在定义时就必须赋值。
with an object reference ,final makes the reference a constant...
final修饰对象引用时,这个引用便是一个常量,即引用一旦被初始化指向一个对象便不能指向另外一个对象,然而对象本身是可以改变的。
java does not provide a way to make any arbitrary object a constant...
java不能使任何一个对象变成常数(constant)
实验代码(来自于thinking in java)
在整理时略有改动...
package _20120202; import java.util.Random; class Value { int i; public Value(int i){ this.i = i; } } public class FinalData { private static Random rand = new Random(47); private String id; public FinalData(String id){ this.id = id; } //can be compile-time constants... private final int valueOne = 9; private static final int ValueTwo = 99; //typical public constant... public static final int ValueThree = 39; //cannot be compile-time constants... private final int i4 = rand.nextInt(20); private final int int_5 = 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+" ,int_5 = "+int_5; } public static void main(String[] args){ FinalData fd1 = new FinalData("fd1"); //fd1.valueOne++;//error:cannot change value.. fd1.v2.i++;//the object is not constant... fd1.v1= new Value(9); for(int i = 0;i < fd1.a.length;i++){ fd1.a[i]++;//Object isn't constant... } /** * Error cannot change the references... */ //fd1.v2 = new Value(0); //fd1.v3 = new Value(1); //fd1.a = new int[8];//cannot point to another object... System.out.println(fd1); System.out.println("creating new FinalData:"); FinalData fd2 = new FinalData("fd2"); System.out.println(fd1); System.out.println(fd2); } }
程序的运行结果如下:
fd1: i4 = 15 ,int_5 = 18
creating new FinalData:
fd1: i4 = 15 ,int_5 = 18
fd2: i4 = 13 ,int_5 = 18
程序中ValueThree,final是说此变量是一个常量,static强调唯一性...v2的i值可以改变但是不能重新被赋给新的对象(fd1.v2 = new Value(0);)说明了当一个引用为final时只是说明该引用不能重新只相信的对象,但是对象本身的值是可以改变的。
以下用程序说明Static final 与final的区别:
代码如下:
package _20120202; import java.util.Random; /** * show the difference between the static final and final... * @author yolanda * */ public class FinalDataTest { private static Random rand = new Random(2000); private final int id = rand.nextInt(30); private static final int share = rand.nextInt(30); public String toString(){ return "the object's information is "+" id = "+id+" share : "+share; } public static void main(String[] args){ FinalDataTest fd1 = new FinalDataTest(); FinalDataTest fd2 = new FinalDataTest(); System.out.println(fd1); System.out.println(fd2); } }
运行结果:
the object's information is id = 29 share : 29
the object's information is id = 4 share : 29
结论:
有结果可知两个对象的id不同,但是两个对象的share是相同的。share变量是static final的,属于编译时常量,static表示在加载的时候只生成一次,并不会再每次创建对象的时候都会创建。
final关键字之blank final
java允许创建blank final即变量声明为final但是没有进行初始化,但是在任何时候变量在使用前都必须要进行初始化。
blank final的存在使得final的用法很灵活,它可以让每一个类中的final变量不同的同时也保持了这个变量的不变性。
实验代码(来自于thinking in java)
package _20120202; class Poppet{ private int i; public Poppet(int i){ this.i = i; } public int getI(){ return this.i; } } public class BlankFinal { private final int i = 0; private final int j; private final Poppet p; public BlankFinal(){ this.j = 1; this.p = new Poppet(1); } public BlankFinal(int x){ this.j = x; this.p = new Poppet(x); } public String toString(){ return "j = "+this.j+" p = "+this.p.getI(); } public static void main(String[] args){ BlankFinal bf1 = new BlankFinal(); BlankFinal bf2 = new BlankFinal(4); System.out.println(bf1); System.out.println(bf2); } }
程序结果:
j = 1 p = 1
j = 4 p = 4
blank final必须在每一个构造函数中进行赋值,这样保证在使用之前变量已经被初始化...
final关键字之final arguments
参数用final修饰则说明该参数你只能读取而不能修改...与final data相同
final关键字之final methods
用final修饰方法有两点好处:1.在继承中保持函数的行为不被改变2.提高函数的运行效率,因为final的methods调用是内联调用(inline calls)。final的方法不能被子类重置(override)。
final关键字之final and private
如果类中的方法是private那么该方法前面加final对于这个函数本身的性质没有任何影响。
final关键字之final classes
final class不允许被继承,也不能被改变,final类的函数默认都是final类型的
final关键字之final caution(暂时没有看懂,待以后解决)