一.final关键字的好处
1.final关键字提高了性能。JVM和Java应用都会缓存final变量。2.final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。3.使用final关键字,JVM会对方法、变量及类进行优化。
二.final修饰属性
1.final修饰的属性表示不可改变2.final修饰类对象表示该引用不能改变,但其内容是可以改变的3. final修饰数组与修饰类对象相同,表示该引用不能改变,但其内容是可以改变的4.final修饰的属性必须赋值 可以在构造方法中赋值,因为构造方法一定会被调用,所以一定会赋值,不能在普通方法中赋值。
/** * date:2017年4月17日16:45:04 * target:final修饰数据。 * @author ypy */ public class Final_1{ public static void main(String[] args) { FinalData f1 = new FinalData(); FinalData f2 = new FinalData(); //f1.i1++; 错误,final修饰的属性表示不可改变的 System.out.println("f1:i3=" + f1.i3 + ",i4=" + f1.i4);//f1和f2的i4值相同,体现了static的特性 System.out.println("f2:i3=" + f2.i3 + ",i4=" + f2.i4); f1.v1.i++; f1.v2.i++; f1.v1 = new Value(); //f1.v2 = new Value(); final修饰类对象表示该引用不能改变,但其内容是可以改变的 for (int i=0; i<f1.a.length; i++) { f1.a[i]++; System.out.println(f1.a[i]); } int[] b = {1,2,3}; //f1.a = b; final修饰数组与修饰类对象相同,表示该引用不能改变,但其内容是可以改变的 } } class Value { int i = 1; } class FinalData { //基本数据类型作为编译期的常数 final int i1 = 2; static final int I2 = 5; //注意对于含有固定初始化值(即编译期常数)的 fianl static基本数据类型,它们的名字根据规则要全部采用大写。 //基本数据类型作为运行期的常数,所以不是final修饰的属性就一定会在编译期赋值 final int i3 = (int) (Math.random()*20); static final int i4 = (int) (Math.random()*20); //非基本数据类型 Value v1 = new Value(); final Value v2 = new Value(); //final int i5; final修饰的属性必须赋值 可以在构造方法中赋值,因为构造方法一定会被调用,所以一定会赋值 // 不能在普通方法中赋值,因为普通方法不一定会被调用,所以不一定会被赋值 //final Value v3; //数组 final int[] a = {1,2,3,4,5}; } /* ***************jdk1.8运行结果*************** f1:i3=10,i4=7 f2:i3=15,i4=7 2 3 4 5 6 */
三.final修饰方法
1.final修饰的方法可以被继承,但不能被重写。2.构造方法不能用final修饰,因为构造方法不能被继承,用final修饰方法的目的是不允许被重写,所以final修饰构造方法没有意义。/** * date:2017年4月17日17:11:59 * target:final修饰方法。 * @author ypy * conclusion: * 一:为什么用final修饰方法? * 1.为方法“上锁”,防止任何继承类改变它的本来含义。 * 2.将一个方法设成 final后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。 * 只要编译器发现一个final 方法调用,就会(根据它自己的判断)忽略为执行方法调用机制而采取的常规代码插入方法(将自变量压入堆栈;跳至方法代码并执行它;跳回来;清除堆栈自变量;最后对返回值进行处理)。 * 相反,它会用方法主体内实际代码的一个副本来替换方法调用。这样做可避免方法调用时的系统开销。 * 二:什么时候用final修饰方法? * 通常,只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设为final。 */ public class Final_2{ public static void main(String[] args) { } } class FinalMethod { // final FinalMethod() { 构造方法不能用final修饰,因为final修饰的方法不能被子类重写,隐含可以被继承,但构造方法是不能被子类继承的。 // // } final void m() { } } class A extends FinalMethod { // void m() { final修饰的方法不能被重写 // // } } /* ***************jdk1.8运行结果*************** */
四.final修饰类
1.final修饰的类不允许继承,其内部的方法都默认被final修饰。