final关键字有哪些作用?应用在类、方法和变量上会有什么效果?
“合抱之木,生于毫末;九层之台,起于累土。” 很多人对基础知识的巩固不够重视。Java 基础就如同大厦的基石,没有稳固的基石,再宏伟的架构也只是空中楼阁。
检验知识是否学得牢固,有一个比较好的办法,假设现在有个面试官问你这个问题,你是否脑瓜子嗡嗡的呢?
为了全面掌握基础知识,我们计划形成基础知识100问,破解大多数的JAVA面试涉及到的基础问题,不用去背八股文,掌握好基础就能灵活应对面试官的提问。
往期我们讨论过的主题有:
1. Java 基本数据类型有哪几种?它们各自所占的字节数是多少?
这里补充一下默认值
byte、short、int的默认值为0
long的默认值为0L
float的默认值为0.0f
double的默认值为0.0d
char的默认值为'\u0000'
boolean的默认值为false
2. JAVA自动装箱和拆箱是如何实现的?在什么场景下会自动发生?
3. Java中的String、StringBuilder和StringBuffer的区别,以及各自的适用场景
4. JAVA技术第4问:==和equals方法在比较对象时的区别是什么?在自定义类中如何正确重写equals方法?
今天咱们是第五问,探讨的内容是:"Java中的final关键字有哪些作用?分别应用在类、方法和变量上时会有什么效果?"
试想一下,如果不往下看,你是否能够完整地回答出这个问题呢? 如果答案是肯定的,那恭喜你,你可以节约些时间去学习别的知识了! 当然,“温故而知新”,如果您不忙的话,接着往下看也无妨。
在 Java 中,final 关键字是一个非常重要的修饰符,它可以应用于类、方法和变量,并且在不同的应用场景下有着不同的效果。下面将详细介绍 final 关键字在这三种情况下的作用和效果。
1. final关键字的作用概述
final 关键字主要用于表示不可改变的概念,即一旦某个元素被 final 修饰,它的值或者状态在初始化之后就不能再被修改。
2. final应用在类上
当 final 关键字用于修饰类时,这个类被称为最终类,意味着该类不能被继承。这通常用于设计一些不希望被其他类扩展的类,例如 Java 中的 String 类就是一个 final 类。
示例代码:
// 定义一个 final 类
final class FinalClass {
public void printMessage() {
System.out.println("This is a final class.");
}
}
// 以下代码会编译错误,因为 FinalClass 是 final 类,不能被继承
// class SubClass extends FinalClass {
// }
public class Main {
public static void main(String[] args) {
FinalClass fc = new FinalClass();
fc.printMessage();
}
}
效果:
阻止其他类继承该 final 类,保证类的完整性和安全性,防止类的行为被意外修改。
3. final应用在方法上
当 final 关键字用于修饰方法时,这个方法被称为最终方法,意味着该方法不能被重写。这通常用于确保方法的实现逻辑不被子类改变。
示例代码:
class ParentClass {
// 定义一个 final 方法
public final void finalMethod() {
System.out.println("This is a final method.");
}
public void nonFinalMethod() {
System.out.println("This is a non-final method.");
}
}
class ChildClass extends ParentClass {
// 以下代码会编译错误,因为 finalMethod 是 final 方法,不能被重写
// @Override
// public void finalMethod() {
// System.out.println("Trying to override final method.");
// }
@Override
public void nonFinalMethod() {
System.out.println("Overriding non-final method.");
}
}
public class Main {
public static void main(String[] args) {
ChildClass cc = new ChildClass();
cc.finalMethod();
cc.nonFinalMethod();
}
}
效果:
防止子类重写该 final 方法,确保方法的实现逻辑在整个继承体系中保持不变,提高代码的稳定性和可维护性。
4. final应用在变量上
当 final 关键字用于修饰变量时,这个变量被称为常量,意味着该变量一旦被赋值,就不能再被重新赋值。final 变量可以分为实例变量、静态变量和局部变量。
示例代码:
class FinalVariableExample {
// 定义一个 final 实例变量
final int INSTANCE_FINAL_VARIABLE;
// 定义一个 final 静态变量
static final int STATIC_FINAL_VARIABLE = 10;
public FinalVariableExample() {
// 实例变量必须在构造函数中初始化
INSTANCE_FINAL_VARIABLE = 20;
}
public void method() {
// 定义一个 final 局部变量
final int LOCAL_FINAL_VARIABLE = 30;
// 以下代码会编译错误,因为 LOCAL_FINAL_VARIABLE 是 final 变量,不能被重新赋值
// LOCAL_FINAL_VARIABLE = 40;
}
}
public class Main {
public static void main(String[] args) {
FinalVariableExample fve = new FinalVariableExample();
System.out.println("Instance final variable: " + fve.INSTANCE_FINAL_VARIABLE);
System.out.println("Static final variable: " + FinalVariableExample.STATIC_FINAL_VARIABLE);
}
}
效果:
确保变量的值在初始化之后不会被修改,提高代码的安全性和可读性。对于引用类型的 final 变量,虽然引用本身不能改变,但引用所指向的对象的内容是可以改变的。
综上所述,final 关键字在类、方法和变量上的应用各有不同的效果,主要目的是为了保证代码的安全性、稳定性和可维护性。