【IT领域新生必看】解锁 `final` 关键字的秘密:Java 编程中的终极武器

文章目录

        • 引言
        • 什么是 `final` 关键字?
        • 一、 `final` 变量
          • `final` 局部变量
          • `final` 实例变量
          • `final` 静态变量
        • 二、 `final` 方法
        • 三、 `final` 类
        • 四、 `final` 关键字的实际应用
          • 1. 定义常量
          • 2. 防止方法被重写
          • 3. 创建不可变类
          • 4. 优化性能
        • 五、 `final` 的一些常见误区
          • 1. `final` 变量不能在构造方法中赋值
          • 2. `final` 类中的所有方法都是 `final` 的
          • 3. `final` 变量的引用不能改变
        • 结论

在这里插入图片描述

引言

在编程的世界里,关键字是语言设计者赋予开发者的强大工具,每个关键字都有其独特的用途和重要性。对于Java程序员来说,final 是一个极其重要且常用的关键字。它不仅有助于提高代码的安全性和稳定性,还能优化性能,帮助开发者编写更高效的代码。但是,final 关键字的用途和使用场景可能让初学者感到困惑。今天,我们将深入探讨Java中的 final 关键字,揭示它的真正威力,并展示如何在实际编程中巧妙地运用它。

什么是 final 关键字?

在Java中,final 是一个特殊的关键字,它可以用于变量、方法和类,表示它们不能被修改。具体来说:

  • final 变量:表示常量,一旦赋值就不能更改。
  • final 方法:表示该方法不能被子类重写。
  • final 类:表示该类不能被继承。
一、 final 变量

final 关键字用于变量时,它表示这个变量一旦被赋值,就不能再改变。这种变量通常被称为常量。

final 局部变量

局部变量是在方法、构造方法或块中声明的变量。当局部变量被声明为 final 时,它在赋值后就不能再被修改。

public class FinalExample {
    public void demonstrateFinalLocalVariable() {
        final int CONSTANT_VALUE = 10;
        System.out.println("Constant Value: " + CONSTANT_VALUE);

        // 下面的代码将会报错,因为 CONSTANT_VALUE 是 final 的,不能再被修改
        // CONSTANT_VALUE = 20;
    }

    public static void main(String[] args) {
        FinalExample example = new FinalExample();
        example.demonstrateFinalLocalVariable();
    }
}

在这个例子中,CONSTANT_VALUE 是一个 final 变量,赋值为10后不能再被修改。如果尝试重新赋值,编译器会报错。

final 实例变量

实例变量是属于对象的变量。当实例变量被声明为 final 时,它必须在对象初始化时赋值(即在构造方法中赋值),并且一旦赋值就不能再改变。

public class FinalExample {
    private final int id;

    public FinalExample(int id) {
        this.id = id;
    }

    public void showId() {
        System.out.println("ID: " + id);
    }

    public static void main(String[] args) {
        FinalExample example = new FinalExample(1);
        example.showId();

        // 下面的代码将会报错,因为 id 是 final 的,不能再被修改
        // example.id = 2;
    }
}

在这个例子中,id 是一个 final 实例变量,必须在构造方法中赋值,并且赋值后不能再被修改。

final 静态变量

静态变量是属于类的变量,当静态变量被声明为 final 时,它成为一个常量,必须在声明时或在静态初始化块中赋值,并且赋值后不能再改变。

public class FinalExample {
    public static final int MAX_VALUE = 100;

    public static void main(String[] args) {
        System.out.println("Max Value: " + MAX_VALUE);

        // 下面的代码将会报错,因为 MAX_VALUE 是 final 的,不能再被修改
        // MAX_VALUE = 200;
    }
}

在这个例子中,MAX_VALUE 是一个 final 静态变量,它在声明时被赋值为100,并且不能再被修改。

二、 final 方法

final 关键字用于方法时,表示该方法不能被子类重写。这对于设计不可变类或防止子类改变关键行为非常有用。

public class FinalExample {
    public final void showMessage() {
        System.out.println("This is a final method");
    }
}

class SubClass extends FinalExample {
    // 下面的代码将会报错,因为 showMessage 是 final 的,不能被重写
    // @Override
    // public void showMessage() {
    //     System.out.println("Attempting to override final method");
    // }
}

public class Main {
    public static void main(String[] args) {
        SubClass subClass = new SubClass();
        subClass.showMessage();
    }
}

在这个例子中,showMessage 方法被声明为 final,因此它不能被 SubClass 重写。如果尝试重写,编译器会报错。

三、 final

final 关键字用于类时,表示该类不能被继承。这对于设计不可变类或确保类的完整性非常有用。

public final class FinalExample {
    public void showMessage() {
        System.out.println("This is a final class");
    }
}

// 下面的代码将会报错,因为 FinalExample 是 final 的,不能被继承
// class SubClass extends FinalExample {
// }

public class Main {
    public static void main(String[] args) {
        FinalExample example = new FinalExample();
        example.showMessage();
    }
}

在这个例子中,FinalExample 类被声明为 final,因此它不能被继承。如果尝试继承,编译器会报错。

四、 final 关键字的实际应用

final 关键字在实际编程中有广泛的应用,以下是一些常见的使用场景:

1. 定义常量

在程序中定义常量时,通常使用 final 关键字。这可以确保常量的值在整个程序中保持不变。

public class Constants {
    public static final String APP_NAME = "My Application";
    public static final int MAX_USERS = 100;

    public static void main(String[] args) {
        System.out.println("App Name: " + APP_NAME);
        System.out.println("Max Users: " + MAX_USERS);
    }
}
2. 防止方法被重写

在设计类时,某些方法可能不希望被子类重写,以确保其行为的一致性和完整性。此时可以将方法声明为 final

public class BaseClass {
    public final void logAction(String action) {
        System.out.println("Action: " + action);
    }
}

class SubClass extends BaseClass {
    // logAction 方法不能被重写
}

public class Main {
    public static void main(String[] args) {
        SubClass subClass = new SubClass();
        subClass.logAction("Login");
    }
}
3. 创建不可变类

不可变类是指一旦创建就不能修改的类。通过将类声明为 final 并将其所有成员变量声明为 final,可以实现不可变类。

public final class ImmutablePerson {
    private final String name;
    private final int age;

    public ImmutablePerson(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

public class Main {
    public static void main(String[] args) {
        ImmutablePerson person = new ImmutablePerson("Alice", 30);
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());

        // 下面的代码将会报错,因为 ImmutablePerson 是不可变的
        // person.name = "Bob";
        // person.age = 25;
    }
}
4. 优化性能

在某些情况下,将方法或类声明为 final 可以帮助Java编译器进行优化,提高性能。这是因为编译器可以确定这些方法或类不会被重写,从而进行内联优化。

五、 final 的一些常见误区

在使用 final 关键字时,初学者可能会遇到一些常见的误区。了解这些误区可以帮助你更好地使用 final 关键字。

1. final 变量不能在构造方法中赋值

这是一个常见的误解。实际上,final 实例变量可以在声明时赋值,也可以在构造方法中赋值。

public class FinalExample {
    private final int value;

    public FinalExample(int value) {
        this.value = value;
    }
}
2. final 类中的所有方法都是 final

虽然 final 类不能被继承,但这并不意味着其所有方法都是 final 的。方法是否为 final 需要显式声明。

public final class FinalClass {
    public void method1() {
        System.out.println("Method1");
    }

    public final void method2() {
        System.out.println("Method2");
    }
}

在这个例子中,`

method1不是final的,而method2final` 的。

3. final 变量的引用不能改变

对于引用类型的 final 变量,final 关键字只保证引用本身不能改变,但引用的对象内容可以改变。

public class FinalExample {
    private final StringBuilder builder = new StringBuilder();

    public void appendText(String text) {
        builder.append(text);
    }

    public String getText() {
        return builder.toString();
    }

    public static void main(String[] args) {
        FinalExample example = new FinalExample();
        example.appendText("Hello, ");
        example.appendText("World!");

        System.out.println(example.getText());

        // 下面的代码将会报错,因为 builder 是 final 的,不能再赋值
        // example.builder = new StringBuilder();
    }
}

在这个例子中,builder 是一个 final 引用,虽然引用不能改变,但 StringBuilder 对象的内容可以改变。

结论

final 关键字是Java编程中一个非常重要的工具,它有助于提高代码的安全性、稳定性和性能。通过理解和正确使用 final 关键字,我们可以编写出更健壮、更高效的代码。

无论是定义常量、防止方法被重写、创建不可变类,还是优化性能,final 关键字都扮演着重要的角色。希望通过这篇文章,你能更深入地理解 final 关键字的使用场景和实际应用,让你的编程技能更上一层楼。

继续探索和实践 final 关键字的各种用法吧,你会发现它在编程中是一个不可或缺的终极武器!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/791321.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WordPress知识付费系统+自动采集插件

采集功能: 1.支持分类替换 将主站同步过来的文章分类进行替换 2.支持自定义文章作者(选择多个作者则同步到的文章作者将会随机分配) 3.支持添加黑名单分类 添加后 如果同步过来的文章包含黑名单分类将不会发布文章 4.自动检测同步&#xf…

RK3568平台(vendor篇)vendor storage分区

一.简介 rockchip vendor storage是一种用于存储SN, MAC, LAN, BT等数据的区域,它具有不会丢失和系统启动各个阶段都可以访问的特性。它使用GPT分区表格式,并在U-boot, kernel和用户空间中提供了相应的驱动文件和接口。 rockchip vendor storage是一种特…

IP 地址与 CDN 性能优化

内容分发网络(CDN)就是通过内容分配到离用户最优的服务器来提高访问速度。而IP地址如何分配与管理就是CND技术的基础。本文将来探讨介绍CDN中的IP地址分配与管理,以及如何通过CDN优化网络性能。 首先我们来了解CDN的基本原理 CDN是一种分布式…

宏任务与微任务对比【前端异步】

目录 简介微任务与宏任务的基本概念宏任务(Macrotasks)微任务(Microtasks)宏任务示例微任务示例微任务与宏任务的执行时序 结论 简介 在JavaScript的异步编程中,理解事件循环(Event Loop)是至关…

Elasticsearch:Node.js ECS 日志记录 - Morgan

这是之前系列文章: Elasticsearch:Node.js ECS 日志记录 - Pino Elasticsearch:Node.js ECS 日志记录 - Winston 中的第三篇文章。在今天的文章中,我将描述如何使用 Morgan 包针对 Node.js 应用进行日子记录。此 Morgan Node.j…

SpringCloud学习

认识微服务 1.单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署 优点:架构简单 部署成本低 缺点:耦合度高 2.分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发&…

使用来此加密申请多域名SSL证书

在数字化时代的浪潮中,网站的安全性已成为企业和个人不可或缺的一部分。特别是在数据传输和用户隐私保护方面,SSL证书的作用愈发显著。 申请多域名SSL证书步骤 1、登录来此加密网站,输入域名,可以勾选泛域名和包含根域。 2、选择…

【结构型模式-代理模式】

概述 由于某些原因需要给某对象提供一个代理以控制该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象与目标对象之间的中介。 Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生…

手撸俄罗斯方块(五)——游戏主题

手撸俄罗斯方块(五)——游戏主题 当确定游戏载体(如控制台)后,界面将呈现出来。但是游戏的背景色、方块的颜色、方框颜色都应该支持扩展。 当前游戏也是如此,引入了 Theme 的概念,支持主题的扩…

ADS基础教程24 - Gerber文件的导入

EM介绍 一、引言二、基本概念1.仿真文件下载2.仿真文件介绍 二、导入步骤1.新建workspace2.选择Layout结构3.导入设计4.选择文件类型5.导入文件6.预览文件内容7.铜皮离散问题 四、总结 一、引言 本章节开始介绍在ADS中进行PCB仿真,首先讲解如何将Gerber文件导入到A…

顺序结构 ( 四 ) —— 标准数据类型 【互三互三】

序 C语言提供了丰富的数据类型,本节介绍几种基本的数据类型:整型、实型、字符型。它们都是系统定义的简单数据类型,称为标准数据类型。 整型(integer) 在C语言中,整型类型标识符为int。根据整型变量的取值范…

【RHCE】基于用户认证和TLS加密的HTTP服务(HTTPS)

目录 一、创建用户账号 二、TLS加密 三、配置http服务子配置文件 四、创建访问http服务的文件夹以及输入重定向到文件 五、配置Linux本地仓库以及Windows下的本地仓库 六、基础操作 七、测试 一、创建用户账号 用户认证 # 创建两个账户 [rootlocalhost ~]# htpasswd -…

YOLOv10改进 | 损失函数篇 | SlideLoss、FocalLoss、VFLoss分类损失函数助力细节涨点(全网最全)

一、本文介绍 本文给大家带来的是分类损失 SlideLoss、VFLoss、FocalLoss损失函数,我们之前看那的那些IoU都是边界框回归损失,和本文的修改内容并不冲突,所以大家可以知道损失函数分为两种一种是分类损失另一种是边界框回归损失,…

【安全设备】数据库审计

一、什么是数据库审计 数据库审计(简称DBAudit)是一种以安全事件为中心,实时记录网络上的数据库活动,并对数据库操作进行细粒度审计的合规性管理技术。它通过对用户访问行为的记录、分析和汇报,帮助用户事后生成合规报…

一套基于 Ant Design 和 Blazor 的开源企业级组件库

前言 今天大姚给大家分享一套基于Ant Design和Blazor的开源(MIT License)、免费的企业级组件库(喜欢Ant Design风格的同学推荐使用):Ant Design Blazor。 项目特性 提炼自企业级中后台产品的交互语言和视觉风格。 开…

Codeforces Round #956 (Div. 2) and ByteRace 2024 E. I Love Balls(概率期望)

题目 思路来源 官方题解 题解 特殊球不会改变普通球的顺序,所以都是alice拿一半里较多的部分 n-k1一半向上取整就是(n-k2)/2,同理n-k个一般向上取整(n-k1)/2 每个特殊球独立地来看,在每个空隙的概率相同 所以分别统计特殊球和非特殊球的…

《Windows API每日一练》9.1.5 自定义资源

自定义资源(Custom Resources)是在 Windows 程序中使用的一种资源类型,用于存储应用程序特定的数据、图像、音频、二进制文件等。通过自定义资源,开发者可以将应用程序所需的各种资源文件集中管理和存储,便于在程序中访…

华为HCIP Datacom H12-821 卷34

1.单选题 防火墙默认已经创建了一些安全区域,以下哪一个安全区域不是防火墙上默认存在的? A、Trust B、DMZ C、Internet D、Local 正确答案: C 解析: 防火墙默认情况下为我们提供了三个安全区域,分别是 Trust、DMZ和Untrust 2.判断题 …

【RHCE】实验(HTTP,DNS,SELinux,firewalld的运用)

一、题目 二、主服务器配置 1.下载HTTP服务,DNS服务 [rootlocalhost ~]# yum install -y httpd bind 2.开启防火墙,放行服务 # 开启防火墙 [rootlocalhost ~]# systemctl start firewalld # 放行服务 [rootlocalhost ~]# firewall-cmd --add-service…

日常学习-20240710

1、一次一千万条数据插入和删除案例: 第一次:插入--批量插入,每次插入5000条数据,总耗时28min,数据无异常 删除--通过sql语句一次性删除,总耗时1h52min;一次删除的数据过多导致mysql的备份恢复文件极其庞大&#xff0…