附言:这是公子雪的第一篇博客,如果写的不好或者有错误还请大家批评与指正。
正言: 关于'final'关键字相信各位java看官不是很陌生吧,它修饰类,类不可以被继承,修饰成员变量,变量不可以被更改,修饰成员方法,方法不可在子类中被重写。由此可见凡是final修饰的东西都是不可更改的,不可变的,典型的代表就是我们的String类了,至于具体的细节我们就不谈了。
再附加一句,java的数据类型包括基本数据类型以及引用数据类型(对象的地址值),但是说白了都是值,所以对于java只有值传递这句话,各位看官随意。
public class InnerClass {
private String msg = "OutClass's msg";
private static Thread thread;
public final void check(final String m) {
(thread = new Thread() {
public void run() {
System.out.println(m);
System.out.println(msg);
}
}).start();
}
public void check(String frc,int temp){
}
public static void main(String[] args) {
InnerClass oc = new InnerClass();
oc.check("Need to pass to inner Class");
}
}
注:代码是引用他人的,我做了一些改动,点击查看引用地址:代码引用地址
场景一:内部类的周期大于成员方法的周期
显然static修饰的类变量的周期是与类同步的,所以这个引用指向的匿名内部类的实例化对象的周期是与类同步的,远大于成员方法中局部变量的周期。
上面是使用匿名内部类的示列, 在成员方法中定义匿名内部类实际上就是实例化该类 的实列,也就是一个对象,是放在堆内存中的,如果一直有引用指向它,那么它就一直存在,不会消亡。于是就会出现内部类的周期大于成员方法的周期的情况,成员方法的成员变量周期就是在调用时创建,在调用后消亡,所以按照正常的思维,编译时内部类是调用不了成员变量的,但是java在编译时编译器对此作了特殊处理,反编译之后即可看到,编译器会把内部类所用到的成员方法的局部变量copy一份作为内部类的成员变量来实现对局部变量的调用。聪明的看官可能就会想到假如外部的局部变量因为某种原因而发生改变了呢,那程序的运行结果不就不符合预期了吗,再假如内部类中将局部变量改了,那不更加不可预测了吗?那怎么办呢,如果要保证双向的数据同步一致我们目前做不到呀,于是干脆就用final去修饰吧,两边都加,两边都不可改,保证数据的一致性,这样我们的final就这样施施然的出来了。
第一次写博客,如有错误还请指正