今天看到了final字段这块,把不会的或者难点记录下来。
第一,空白final。
书上说的有点绕,说空白final更灵活。但之前又说过final变量必须进行初始化,这是什么意思呢,二者难道有冲突吗?
其实空白final的核心就是:构造器赋值。
第二,static final 同 final 的区别。
以前我提过,static字段只会初始化一次,无论你创建多少个对象。那么static final 和 final的区别也在此。
执行结果为:
第一次初始化 a = 33
第二次初始化 a = 64
第一次初始化 b = 20
第二次初始化 b = 20
第三,关于final修饰的方法作用—方法锁定、效率。
方法锁定简单,防止子类继承,再重写之。例如 String
效率这块,现在的JAVA 5以上的版本,JVM会自动处理这块的效率,所以,不需要考虑为了加快调用速度而是用final。
第四,private final修饰。
当你要隐藏某种实现,并确保这种实现在任何情况都不需要修改的情况下,才能使用这个。
第五,final类。
不想被任何人继承。同第四点类似,只是范围扩大到类。final类中所有的方法默认为final方法、所有的变量默认为final变量。
第一,空白final。
书上说的有点绕,说空白final更灵活。但之前又说过final变量必须进行初始化,这是什么意思呢,二者难道有冲突吗?
其实空白final的核心就是:构造器赋值。
package com.test;
/**
* Created with IntelliJ IDEA.
* User: 菜鸟大明
* Date: 14-6-21
* Time: 下午7:39
* To change this template use File | Settings | File Templates.
*/
public class FinalTest {
private final int b;
public FinalTest(int inputInt) {
b = inputInt;
}
}
第二,static final 同 final 的区别。
以前我提过,static字段只会初始化一次,无论你创建多少个对象。那么static final 和 final的区别也在此。
class FinalTest2 {
private static Random random = new Random();
private final int a = random.nextInt(100);
private static final int b = random.nextInt(100);
public static void main(String[] args) {
FinalTest2 test1 = new FinalTest2();
// 再次创建对象FinalTest2,a变量被重新初始化,b变量因static的原因,不再执行初始化,而保留第一次初始化的值
FinalTest2 test2 = new FinalTest2();
System.out.println("第一次初始化 a = " + test1.a);
System.out.println("第二次初始化 a = " + test2.a);
System.out.println("第一次初始化 b = " + test1.b);
System.out.println("第二次初始化 b = " + test2.b);
}
}
执行结果为:
第一次初始化 a = 33
第二次初始化 a = 64
第一次初始化 b = 20
第二次初始化 b = 20
第三,关于final修饰的方法作用—方法锁定、效率。
方法锁定简单,防止子类继承,再重写之。例如 String
效率这块,现在的JAVA 5以上的版本,JVM会自动处理这块的效率,所以,不需要考虑为了加快调用速度而是用final。
第四,private final修饰。
当你要隐藏某种实现,并确保这种实现在任何情况都不需要修改的情况下,才能使用这个。
第五,final类。
不想被任何人继承。同第四点类似,只是范围扩大到类。final类中所有的方法默认为final方法、所有的变量默认为final变量。