Final可用在哪些位置? 分别表示什么作用?

本文详细探讨了Java中final关键字的用法,包括final修饰类、方法和变量的含义和效果。final修饰的类不可被继承,final方法无法被重写,JVM可能尝试对final方法进行内联优化。final变量一旦初始化后不可改变,引用类型时仅引用不可变,内容可变。final常量在编译阶段存入常量池。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

速记

  1. 被final修饰的类不可以被继承
  2. 被final修饰的方法不可以被重写
  3. 被final修饰的变量不可以被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变。
  4. 被final修饰的方法,JVM会尝试将其内联,以提高运行效率(早期java)
  5. 被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可以用于修饰类,方法,变量。
作用分别是:

  1. 被final修饰的类不可以被继承
  2. 被final修饰的方法不可以被重写
  3. 被final修饰的方法,JVM会尝试将其内联,以提高运行效率(早期java。
  4. 被final修饰的变量不可以被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变
  5. 被final修饰的常量,在编译阶段会存入常量池中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值