final关键字有哪些作用?应用在类、方法和变量上会有什么效果?

createh54周前 (02-18)技术教程12

“合抱之木,生于毫末;九层之台,起于累土。” 很多人对基础知识的巩固不够重视。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 关键字在类、方法和变量上的应用各有不同的效果,主要目的是为了保证代码的安全性、稳定性和可维护性。

相关文章

java中类变量和实例变量的实质区别?

类变量和实例变量的区别相对于static(静态的)或说类的, 本章开始提到的都是instance(实例的)或说对象的。 每个对象都有自己的一份儿对象域或实例域,相互之间没关系, 不共享。 我们可以从对...

Java变量、常量、运算符、数组_java常量与变量例子

变量(Variables)在 Java 中,变量用于存储程序运行时所需的数据(The data required during the runtime)。变量的声明(The declaration o...

Java变量_java变量名命名规则

变量如果按照大部分的书上来说,在程序运行过程中可以改变的量称之为变量。常量就是程序运行中不可改变的量就是常量。变量准确的来说就是存储的名称,如果你要把数据存到内存里,你就需要选择一个数据类型,而且还要...

Java SE 基础教程—JDK的下载安装及环境变量的配置(win10详细版)

1.什么是JDKSun公司提供了一套Java开发环境,简称JDK(Java Development Kit) 它是整个Java的核心,其中包括Java编译器、Java运行工具、Java文档生成工具、J...

初识Java—(二十四)Java类成员_java 类

static关键字修饰的成员就是类成员,其中有类变量Field、类方法、静态初始化块。static修饰的类成员属于整个类,不属于单个实例。6.3.1 理解类成员在Java类里只能包含Field、方法、...

4.Java变量_java 变量

变量(Variables )每个程序都使用值。变量允许您通过将值分配给一个名称来存储值。该名称可用于在程序的后面引用该值。例如,在游戏开发中,您可以使用一个变量来存储玩家得分的点数。每个变量都有一个类...