码迷,mamicode.com
首页 > 其他好文 > 详细

谈谈final

时间:2015-03-20 18:46:42      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:final   java   编译器   不可变   


用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

标签:final   java   编译器   不可变   

原文地址:http://blog.csdn.net/dlf123321/article/details/44493691

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!