用final修饰类
这种情况很简单,这个类不能被继承。它"绝后"了。
用final修饰方法
这里可以分两种情况。
用final修饰private方法。其实也不能这么说,英文私有方法也被编译器隐式修饰为final,这意味着private final void f()和private void f()并无区别。
用final修饰public方法。 那么此方法不能被重写。
用final修饰参数
举个例子
public void f2(final int a ,final User u) {
a=15; //error
u.setPassWord("sdf"); //correct
u=new User(); //error
System.out.println("类b中的f2被调用了");
}
用final修饰成员变量
我们看代码
import java.util.ArrayList;
import java.util.List;
public class ListWrapper<E> {
private final List<E> list;
private final int a=15;
public ListWrapper(){
list = new ArrayList<E>();
// a=10;
}
public boolean contains(E e){
return list.contains(e);
}
public void add(E e){
list.add(e);
}
public void remove(E e){
list.remove(e);
}
public static void main(String[] args){
ListWrapper<Person> list=new ListWrapper<Person>();
Person a=new Person();
Person b=new Person();
list.add(a);
System.out.println(list.contains(a));
list.remove(a);
}
}
成员变量是随类初始化或对象初始化而初始化的,当执行静态初始化块时候可以对类属性进行赋初始值,当执行普通初始化块或者构造器的时候可以对实例属性赋初始值。因此成员变量的初始值可以在定义的时候赋值或者在初始化块、构造器中指定。
因此对于list与a的赋值,我们可以在构造函数里赋值,也可以在定义的时候赋值,也可以在静态代码块里赋值。不过如果是在静态代码块里赋值,那么成员变量也应该是静态的。
除了在上述三个地方对final变量赋值外,在其他地方都是非法的。
另外用final修饰list,或者说修饰引用类型变量,final只保证变量引用的地址不变,但可以改变堆内存的具体信息。
例如,我可以使用ListWrapper的add和remove方法。此时我改变的是list在堆内存的数据信息,但是list在堆内存的位置并没有改变。
参考资料
http://blog.sina.com.cn/s/blog_6275b95d0100xdfd.html
http://www.cnblogs.com/zuoxiaolong/p/life27.html
http://blog.163.com/maomaoyu_1012/blog/static/19060130520116269329894/谈谈final
原文:http://blog.csdn.net/dlf123321/article/details/44493691