文章目录
前言
速记
- 被final修饰的类不可以被继承
- 被final修饰的方法不可以被重写
- 被final修饰的变量不可以被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变。
- 被final修饰的方法,JVM会尝试将其内联,以提高运行效率(早期java)
- 被final修饰的常量,在编译阶段会存入常量池中。
一、final修饰类
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。
简单来说就是字面意思的最终类。
二、final修饰方法
1.被final修饰的方法不可以被重写
当然如果你用final修饰一个private方法,然后继承类后写一个一样的方法,会出现看似重写的情况,但这只是自欺欺人。因为这种方法下,你前面那个final方法本来就没有被继承,你只是重新写了一个一样的方法,
public class Test {
private final void say(){
System.out.println("说Test");
}
}
class Test_final_class extends Test{
public void say(){
System.out.println("说Test1");
}
}
2.被final修饰的方法,JVM会尝试将其内联,以提高运行效率(早期java)
下面这段话摘自《Java编程思想》第四版第143页:
“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“
实际上这本书是2007年出版的了,因此它的最近java版本理论上应该都投入工程实践了。因此这个优化等于没说。
三、final修饰变量
1.被final修饰的变量不可以被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变。
对于一个final变量,
如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;
如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象,但是你可以修改其内的属性。
final int a = 100;
a = 101;//报错
final int[] list = new int[]{1};
list = new int[]{2};//报错
list[0] = 2;
因此理解一下:
final修饰变量的本质是final修饰的变量会指向一块固定的内存, 这块内存中的值不能改变.
而引用对象是在这块内存里指向的是对象的引用,对象的相关属性在另外的内存放着。
2.被final修饰的常量,在编译阶段会存入常量池中。
public static void main(String[] args) {
int n1 = 2021; //普通变量
final int n2 = 2021; //final修饰的变量
String s = "2021优快云";
String s1 = n1 + "优快云"; //拼接字符串"2021优快云"
String s2 = n2 + "优快云";
System.out.println(s == s1); //false
System.out.println(s == s2); //true
}
拼接s2时,由于n2和“优快云”都是常量,所以可以直接将“2021优快云”返回给s2即可,不必等到运行时再拼接。
由于被final修饰的常量会在编译期进入常量池, 如果有涉及到该常量的操作, 很有可能在编译期就已经完成。
总结
final可以用于修饰类,方法,变量。
作用分别是:
- 被final修饰的类不可以被继承
- 被final修饰的方法不可以被重写
- 被final修饰的方法,JVM会尝试将其内联,以提高运行效率(早期java。
- 被final修饰的变量不可以被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变
- 被final修饰的常量,在编译阶段会存入常量池中。