用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在堆内存的位置并没有改变。

/////////////////////////////////

以下为2019-9-13日更新

如果是这么一种情况

class Person{
	private int score=0;
	final private int money;

	public Person(int m){
		money=m;
	}

	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	public int getMoney() {
		return money;
	}

}

那么

		Person person=new Person(4);
		person=new Person(5);
		System.out.println(person.getMoney());

上面的代码OK么?

答案是OK的,最开始的4那个p指向的person已经被垃圾回收了

以上为2019-9-13日更新

/////////////////////////////////

再看一个例子

String a="abc";
a="edf";

String的源码:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
.......

}

String型的a可变,String是被final修饰的 这个不矛盾么?

用final修饰String 表示String不可被继承

用final修饰value表示String中的这个变量不可重新赋值

我们看下面的例图就OK了

a="def";

并不是复写了abc,而是让变量a指向另一块内存,至于原来的"abc"就等着gc来回收。

参考资料

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/

最新文章

  1. iOS上传文件代码,自定义组装body
  2. mvc项目controller重命名了,用原网页url访问不了了,怎么办?
  3. Scalaz(16)- Monad:依赖注入-Dependency Injection By Reader Monad
  4. C#中的多线程 - 基础知识
  5. http协议读书笔记3-Web服务器
  6. Evaluation of Expression Tree
  7. 【转】Android:Bluetooth 的打开和关闭--不错
  8. .NET枚举类型转为List类型
  9. Android 中更新UI的方法
  10. 红米Note 5A完美卡刷开发版获得ROOT超级权限的方法
  11. MySQL(3)---MySQL优化
  12. 6E - 寒冰王座
  13. C#对Windows文件/文件夹/目录的一些操作总结
  14. 类属性判断 hasattr getattr
  15. Python中的类方法、实例方法、静态方法
  16. AtomicInteger源码解析
  17. TCP中的三次握手和四次挥手
  18. jmeter逻辑控制器
  19. Julia - 三元运算符
  20. 膨胀、腐蚀、开、闭(matlab实现)

热门文章

  1. Hadoop 伪分布式安装、运行测试例子
  2. 开发人员需要熟知的常用Linux命令Version、Kernel查看
  3. android:shape属性详解
  4. Emojicon表情之快速应用于Android项目
  5. Dynamics CRM2013/2015 插件注册工具登录后无法显示assembly列表问题的解决办法二
  6. Linux 基于IPC机制实现进程间的共享内存处理
  7. Cytoscape源码下载地址和编译办法
  8. ubuntu文件管理常用命令
  9. 如何在Cocos2D 1.0 中掩饰一个精灵(一)
  10. 解决uploadify在使用IE内核等浏览器无法使用