关于final的一点思考

来源:互联网 发布:知道mac地址怎么查ip 编辑:程序博客网 时间:2024/06/03 21:46

Javafinal关键字,作用就是描述其为不变的,这个“其”可以是类、方法或变量或其他的(还有吗?)。被修饰的就是不能变的!

 

下面阐述几个例子:


final class Test1 {public String string;    Test1(String string) {        this.string = string;    }} public Test1 test1 = new Test1("hhhhhhh");


 阐述:修饰的类。产生什么效果呢?意思就是“这个类不能变了,不能被继承了。”

对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

public final Set<String> threeNames = new HashSet<>();

阐释:修饰的引用。什么是引用呢?引用我觉得应该就是一个地址。所以意思就是“这个引用不能变了”==“这个地址不能变了”。具体效果:new HashSet<>()产生的对象的地址永远在threeNames里面存着了,谁也不能改变,比如threeNames = new TreeSet<>()(让new TreeSet<>()对象的地址替换掉threeNames原有的new HashSet<>()产生的对象地址。)是会报错的。但是可以threeNames.clear()是没问题的,因为这是对new HashSet<>()对象的操作,threeNames引用是final(不能变的),但是threeNames指向的对象可没有被final修饰,所以可以修改。这就是“不可变的对象引用”与“不可变的对象”之间的关系。


public final int anInt = 123;

 阐释:修饰的基本数据类型的变量。

修饰方法

  下面这段话摘自《Java编程思想》第四版第143页:

使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。

因此,如果只有在想明确禁止该方法在子类中被覆盖的情况下才将方法设置为final的。

  注:类的private方法会隐式地被指定为final方法。

    另外,Java中的String类就是一个final