【面试干货】深入理解Java中的final关键字
- 一、被 final 修饰的类
- 二、被 final 修饰的方法
- 三、被 final 修饰的变量
- 四、被 final 修饰的常量
💖The Begin💖点点关注,收藏不迷路💖 |
在Java中,final关键字有多种用途,可以用来修饰类、方法和变量。不同的修饰对象有不同的含义和作用。以下是对这些用法的详细解释:
一、被 final 修饰的类
不可以被继承: 当一个类被声明为 final 时,这个类不能有子类。也就是说,不能从这个类派生出新的类。
例如:
public final class MyClass {// class body
}// 这将导致编译时错误:
// public class SubClass extends MyClass { }
二、被 final 修饰的方法
不可以被重写: 当一个方法被声明为 final 时,这个方法不能在子类中被重写。这样可以避免该方法的行为被改变。
例如:
public class ParentClass {public final void display() {System.out.println("This is a final method.");}
}public class ChildClass extends ParentClass {// 这将导致编译时错误:// public void display() { }
}
JVM 会尝试将其内联,以提高运行效率: 由于 final 方法不能被重写,JVM 可以更容易地进行优化,例如内联调用,即在调用处直接展开方法体,从而减少方法调用的开销,提高运行效率。
三、被 final 修饰的变量
- 不可变: 被 final 修饰的变量在初始化之后不能再被改变。这适用于基本数据类型和引用类型。
1、修饰基本数据类型: 变量的值在初始化后不能再改变。
例如:
public class MyClass {public static final int MY_CONSTANT = 10;
}
2、修饰引用类型: 引用不可变,但引用指向的对象内容可变。
例如:
import java.util.ArrayList;
import java.util.List;public class MyClass {// 声明一个常量 MY_LIST,它是一个静态的、不可重新赋值的空ArrayListpublic static final List<String> MY_LIST = new ArrayList<>();public static void main(String[] args) {// 允许修改列表的内容,例如向列表中添加元素MY_LIST.add("Hello");// 不允许重新赋值给 MY_LIST,这会导致编译时错误// MY_LIST = new ArrayList<>();}
}
四、被 final 修饰的常量
在编译阶段会存入常量池中: 被 final 修饰的常量(尤其是基本数据类型和字符串常量)在编译时就会被存入常量池中,这样在运行时可以直接使用该值,减少了存取的开销。
例如:
public class MyClass {public static final String CONSTANT = "Hello World";
}
总结起来,final 关键字在Java中提供了一种机制来控制类的继承、方法的重写以及变量的可变性,同时也能帮助JVM进行一些优化,提高程序的运行效率。
💖The End💖点点关注,收藏不迷路💖 |