使用final需要注意哪些事项
下面我们就来明确在变量中使用final的需要注意的规则,以及在局部和匿名类中关于使用final变量的特殊探讨,下面一起来看接下来的内容搞吧。
1.对于final变量,编译器和处理器都要遵守两个重排序规则
构造函数内,对一个 final 变量的写入,与随后把这个被构造对象的引用赋值给一个变量,这两个操作之间不可重排序;
首次读一个包含 final 变量的对象,与随后首次读这个 final 变量,这两个操作之间不可以重排序。
2.局部内部类和匿名内部类只能访问局部final变量
为了解决这个问题,我们先要去使用代码去验证一下。
public class Test { public static void main(String[] args) { } //局部final变量a,b public void test(final int b) { final int a = 10; //匿名内部类 new Thread(){ public void run() { System.out.println(a); System.out.println(b); }; }.start(); } }
原因是为什么呢?这是因为test()方法里面的参数a和b,在运行时,main线程快要结束,但是thread还没有开始。因此需要有一种机制,在使得运行thread线程时候能够调用a和b的值,怎么办呢?java采用了一种复制的机制,
也就说如果局部变量的值在编译期间就可以确定,则直接在匿名内部里面创建一个拷贝。如果局部变量的值无法在编译期间确定,则通过构造器传参的方式来对拷贝进行初始化赋值。
1.abstract定义abstract关键字可以修改类或方法。abstract 类可以扩展(增加子类),但不能直接实例化。abstract 方法不在声明它的类中实现,但必须在某个子类中重写。2.特点可 ...