用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/

谈谈final的更多相关文章

  1. 谈谈 final finally finalize 区别

    声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点, ...

  2. java面试题(杨晓峰)---第三讲谈谈final、finally、finalize有什么不同?

    java语言有很多看起来相似,但用途却完全不相同的语言要素,这些内容往往容易成为面试官考察你知识掌握程度的切入点. 今天我要问你一个基础的java经典题目,谈谈final.finally.finali ...

  3. Java核心-03 谈谈final、finally、 finalize有什么不同?

    今天,我要问你的是一个经典的 Java 基础题目,谈谈 final.finally. finalize 有什么不同? 典型回答 final 可以用来修饰类.方法.变量,分别有不同地意义,final修饰 ...

  4. 谈谈final的作用

    前言 一直想写写这个话题.代表公司也面试过一些求职者,每次面试我必问的两个问题之一就是“请你谈一谈对于final关键字的理解”.这是一个简单的小问题,但是不要小看它,通过对这个问题的回答以及一些简单的 ...

  5. 谈谈final、finally、finalize的区别

    1.final:如果一个类被final修饰,意味着该类不能派生出新的子类,不能作为父类被继承.因此一个类不能被声明为abstract,又被声明为final.将变量或方法声明为final.可以保证他们在 ...

  6. 谈谈final、finally和finalize

    final: final为修饰符, 如果类被声明为final,则不能派生新子类. 如果变量被声明为final,则必须在声明时初始化,在以后的引用只能读取,不可修改. 如果方法被final声明,则只能使 ...

  7. 谈谈final, finally, finalize的区别

    final 修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为fi ...

  8. Java核心技术36讲----------谈谈final、finally、finalize有什么不同

    一.final 1.final修饰方法时,需要注意的点: #final修饰方法时,之前的第二个原因是效率.但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升.在最近的Java版本中,不需要使用 ...

  9. Java基础(三)-final关键字分析

    今天来谈谈final关键字的作用, 虽然有很多博文关于final进行了很深的研究,但还是要去记录下谈谈自己的见解加深下印象.下面直接进入主题: 一.final关键字的作用 1.被final修饰的类不能 ...

随机推荐

  1. Linux块设备加密之dm-crypt分析

    相关的分析工作一年前就做完了,一直懒得写下来.现在觉得还是写下来,以来怕自己忘记了,二来可以给大家分享一下自己的研究经验. 这篇文章算是<Device Mapper代码分析>的后续篇,因为 ...

  2. ExpandableListView的使用

    ExpandableListView的使用 效果图 布局 <ExpandableListView android:id="@+id/expandableListView" a ...

  3. 递归的神奇之处在于你会发现问题竟然解决了--解N皇后谜题有感

    看sicp看到8皇后谜题, 突然兴致来了,尝试独立解决(scheme代码的好处在于,即使你瞟了眼答案, 也不会有任何收获, 除了知道那儿有一坨神秘的括号和英文字符外但Python代码就不同了),成功了 ...

  4. ActiveMQ + NodeJS + Stomp 极简入门

    前提 安装ActiveMQ和Nodejs 测试步骤 1.执行bin\win32\activemq.bat启动MQ服务 2. 打开http://localhost:8161/admin/topics.j ...

  5. Java--Dom解析XML文件

          之前写过几篇关于Java中解析XML文件的方法,不过,感觉不够简单,今天重写了一遍代码,用到的是方法是Dom,其中加入了日志记录功能--Log4j.       好了,不多说了,先把XMl ...

  6. Java基础----Java---集合框架---泛型、泛型方法、静态方法泛型、泛型接口、泛型限定、泛型类

    泛型:jdk1.5后的新特性,用于解决安全问题,是一个安全机制. 好处: 1.将运行时的异常出现问题classcastException.转移到了编译时期.方便程序员调试解决问题,让运行事情问题减少, ...

  7. Android开发学习之路--传感器之初体验

    说到传感器,还是有很多的,有加速度啊,光照啊,磁传感器等等.当然android手机之所以称为智能手机,少不了这几款传感器的功劳了.下面就学习下了,这里主要学习光照,加速度和磁. 新建工程emSenso ...

  8. Android初级教程获取手机位置信息GPS与动态获取最佳方式

    简单介绍一下gps定位的操作. 主要是靠locationmanger这个api完成的一些操作:通过获取这个实例,然后调用它的requestLocationUpdates方法进行注册.传入的参数分别有以 ...

  9. Cocos2D iOS之旅:如何写一个敲地鼠游戏(六):放置地鼠

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  10. Uva - 512 - Spreadsheet Tracking

    Data in spreadsheets are stored in cells, which are organized in rows (r) and columns (c). Some oper ...