java-final 关键字

## Java中的`final`关键字

### 1. `final`关键字的基本概念

`final`是Java中一个非常重要的关键字,用于声明常量、阻止继承和重写,确保类、方法和变量的不可变性。具体来说,`final`关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。

### 2. 修饰类

当一个类被声明为`final`时,意味着这个类不能被继承。使用`final`修饰类可以防止其它类从该类派生子类,从而保护类的完整性。例如:

```java
final class Animal {
    void makeSound() {
        System.out.println("Animal makes a sound.");
    }
}

// 错误示范
// class Dog extends Animal {
//     void makeSound() {
//         System.out.println("Dog barks.");
//     }
// }
```

在上述代码中,`Animal`类被声明为`final`,因此不能被继承。如果尝试创建`Dog`类继承自`Animal`,编译器会报错。

### 3. 修饰方法

当一个方法被声明为`final`时,意味着这个方法不能被子类重写。这对于确保方法的行为在继承层次结构中保持一致性非常有用。例如:

```java
class Animal {
    final void makeSound() {
        System.out.println("Animal makes a sound.");
    }
}

class Dog extends Animal {
    // 错误示范
    // @Override
    // void makeSound() {
    //     System.out.println("Dog barks.");
    // }
}
```

在上述代码中,`Animal`类的`makeSound`方法被声明为`final`,因此不能在`Dog`类中重写。如果尝试重写该方法,编译器会报错。

### 4. 修饰变量

#### 4.1 修饰成员变量

当一个成员变量被声明为`final`时,意味着这个变量在初始化之后不能被改变。`final`成员变量必须在声明时或在构造函数中进行初始化。一旦被赋值,就不能再修改。例如:

```java
class Circle {
    final double PI = 3.14159;
    final double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    double calculateArea() {
        return PI * radius * radius;
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(5.0);
        System.out.println("Area: " + circle.calculateArea());
        // 错误示范
        // circle.PI = 3.14;
    }
}
```

在上述代码中,`PI`和`radius`是`final`成员变量。`PI`在声明时被初始化,而`radius`在构造函数中被初始化。一旦初始化,它们的值不能再被改变。

#### 4.2 修饰局部变量

当一个局部变量被声明为`final`时,意味着这个变量在初始化之后不能被改变。`final`局部变量通常用于确保在方法或代码块中某个值的不可变性。例如:

```java
public class Main {
    public static void main(String[] args) {
        final int number = 5;
        System.out.println("Number: " + number);
        // 错误示范
        // number = 10;
    }
}
```

在上述代码中,`number`是一个`final`局部变量。一旦被初始化,它的值不能再被改变。

#### 4.3 修饰参数

当一个方法参数被声明为`final`时,意味着在方法内部不能改变这个参数的值。这在确保参数在方法内部的不可变性时非常有用。例如:

```java
class Calculator {
    int add(final int a, final int b) {
        // 错误示范
        // a = a + 1;
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        System.out.println("Sum: " + calculator.add(3, 4));
    }
}
```

在上述代码中,`add`方法的参数`a`和`b`被声明为`final`,因此在方法内部不能改变它们的值。

### 5. 修饰引用类型

当一个引用类型变量(如对象引用或数组引用)被声明为`final`时,意味着这个引用不能被重新赋值,但是对象的内容可以被修改。例如:

```java
class Person {
    String name;

    Person(String name) {
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        final Person person = new Person("John");
        System.out.println("Name: " + person.name);
        person.name = "Doe";  // 允许
        System.out.println("Name: " + person.name);
        // 错误示范
        // person = new Person("Jane");
    }
}
```

在上述代码中,`person`引用被声明为`final`,因此不能重新赋值为新的`Person`对象,但可以修改`person`对象的内容(如`name`属性)。

### 6. 不变对象

通过组合使用`final`关键字,可以创建不变对象(Immutable Objects)。不变对象一旦创建,它的状态就不能被改变。例如:

```java
final class ImmutablePoint {
    private final int x;
    private final int y;

    ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

public class Main {
    public static void main(String[] args) {
        ImmutablePoint point = new ImmutablePoint(1, 2);
        System.out.println("X: " + point.getX() + ", Y: " + point.getY());
        // 错误示范
        // point.x = 3;
    }
}
```

在上述代码中,`ImmutablePoint`类是一个不变对象。`x`和`y`属性被声明为`final`且私有,并且只能通过构造函数进行初始化。类本身也被声明为`final`,因此不能被继承,确保对象的不可变性。

### 7. `final`关键字的优势

使用`final`关键字有以下几种优势:

#### 1. 提升性能

`final`关键字可以提升性能。由于`final`变量的值在编译时就已确定,编译器可以对它们进行优化。例如,编译器可以将对`final`变量的访问替换为直接访问常量。

#### 2. 增加安全性

`final`关键字可以增加代码的安全性。通过将类、方法或变量声明为`final`,可以防止它们被修改,从而减少错误的可能性。例如,不变对象在多线程环境下是线程安全的,因为它们的状态不能被修改。

#### 3. 提高可读性

`final`关键字可以提高代码的可读性。通过明确声明某些变量、方法或类是不可变的,其他开发者在阅读代码时可以更容易理解它们的行为和用途。

### 8. 使用`final`关键字的注意事项

虽然`final`关键字有很多优点,但在使用时也需要注意一些问题和局限性:

#### 1. 适度使用

过度使用`final`关键字可能会使代码显得冗长和复杂。在实际开发中,应根据需要和场景合理使用`final`关键字。

#### 2. 确保初始化

`final`变量在声明后必须被初始化,并且只能被赋值一次。需要确保在声明时或在构造函数中对`final`变量进行初始化,否则会导致编译错误。

#### 3. 引用类型的特殊性

对于引用类型的`final`变量,虽然引用本身不能被改变,但对象的内容可以被修改。在设计不变对象时,需要特别注意这一点,确保对象的状态不会被修改。

### 9. 总结

`final`是Java中的一个重要关键字,用于声明常量、阻止继承和重写,确保类、方法和变量的不可变性。通过使用`final`关键字,可以提升代码的性能、安全性和可读性。然而,在使用时也需要注意合理使用和确保初始化。通过正确理解和应用`final`关键字,可以编写出更加稳定、可靠和易维护的Java程序。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】在 Pandas 中使用 AdaBoost 进行分类

我们都找到天使了 说好了 心事不能偷藏着 什么都 一起做 幸福得 没话说 把坏脾气变成了好沟通 我们都找到天使了 约好了 负责对方的快乐 阳光下 的山坡 你素描 的以后 怎么抄袭我脑袋 想的 🎵 薛凯琪《找到天使了》 在数据科学和机器学习的工作…

Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用

系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游&#xff…

Git管理(Linux版本)

在Linux中我们如何把自己的代码上传到gitee中呢,本期将为大家讲解详细的步骤。 目录 查看Linux环境是否存在git工具 在gitee上创建代码仓库 复制仓库的HTTP路径到Linux中 代码上传 在仓库下创建文件或者将文件移动到仓库下 使用三板斧进行文件的上传 add …

Podman常用命令

Podman 是 Red Hat 的一个开源项目,可以免费下载。它是容器化领域的一个相对较新的人,1.0 版将于 2019 年发布。此后 Podman 取得了长足的进步,其崛起伴随着 Docker 的逐渐衰落,该项目在许多方面创造了我们今天所知的容器世界。 容…

linux发展历程

目录 一、基本概念 二、发展历程 三、主要特点 四、应用领域 Linux是一种免费使用和自由传播的类Unix操作系统,其核心由林纳斯本纳第克特托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布。以下是关于Linux的详细介绍&#xff1a…

v3+ts/request封装axios

1.创建一个新的axios实例 2.请求拦截器,如果有token进行头部携带 3.响应拦截器a.剥离无效数据b.处理token失效 4.导出一个函数,调用当前的axios实例发请求,返回值promise import axios, { AxiosError, type Method } from axios import {…

散列函数的基本概念

散列函数 算法不能设计太过复杂 太复杂的散列函数,势必会消耗很多计算时间 散列函数生成的值要尽可能随机并且均匀分布 这样才能避免或者最小化散列冲突而且即便出现来冲突,散列到每个槽里的数据也会比较平均,不会出现某个槽内数据特别多…

AI芯片战场的迁徙:从训练到推理的深度剖析

在人工智能技术的飞速发展中,AI芯片作为底层硬件支撑,一直是技术创新的核心推手。近年来,一个显著的行业趋势是,AI芯片的主战场正悄然从模型训练向推理应用转移。这一转变背后,蕴含着技术发展、市场需求、以及经济效益…

使用Spyder进行Python编程和代码调试

Spyder的官方网站是获取其最新版本和下载安装包的最安全和直接的方式。您可以访问以下网址来下载Spyder: 官方网站下载页面: Home — Spyder IDE 在这个页面上,您会看到不同的下载选项,根据您的操作系统(Windows, macOS, Linux&…

使用 Oracle SQL Developer 导入数据

使用 Oracle SQL Developer 导入数据 1. 导入过程 1. 导入过程 选择要导入数据的表, 然后单击右键,选择"导入数据", 浏览本地文件,选择正确的工作表, 按默认, 按默认, 根据情况修改&…

2. 机器学习概述

机器学习是对能通过经验自动改进的计算机算法的研究。 ---汤姆. 米切尔 1997 通俗来讲,机器学习就是让计算机从数据中进行自动学习,得到某种知识(或规律)。在早期的工程领域,机器学习也经常被称为模式识别(…

React 使用 Zustand 详细教程

前言 Redux、MobX 和 Context API 等技术的存在,使得管理大型应用的状态变得更加可行。本教程要深入探讨的是 Zustand —— 一个极简且高效的状态管理库,详细介绍如何在 React 项目中使用 Zustand 来管理状态。 什么是 Zustand? Zustand 是…

现在的AI大模型,业已进入到泛滥成灾的发展阶段

我们都知道,现在的AI大模型,可以说,业已进入到泛滥成灾的发展阶段。 但凡是一个科技玩家,基本上都会推出自己的大模型。 从某种意义上来讲,AI大模型业已成为一个前瞻性的战略角色,蜕变成为了一种标配角色…

guli商城业务逻辑-基础篇笔记

这里写目录标题 0.1 viscode设置用户代码片段1.实现多级菜单接口1.1 对接前端菜单1.2 对接网关接口解决跨域问题,如果不解决跨域,浏览器还是访问不了api1.3 把商品服务添加网关1.4 修改前端显示分类菜单1.5 给菜单添加删除修改功能1.5.1 删除功能的后端业…

Oracle 入门--前提

目录 1.sqlplus 2.dual是什么? 3.SQL语句的种类 4.Oracle是如何工作的 5.Oracle查看配置文件 6.修改配置文件 7.常用的参数设置 1.sqlplus 管理数据库:启动,关闭,创建,删除对象......查看数据库的运行状态&…

【分布式计算】java消息队列机制

消息队列是一种在不同组件或应用之间进行数据传递的技术,通常用于处理异步通信。它允许消息的发送者(生产者)和接收者(消费者)之间进行解耦。 概念 消息队列是一种先进先出(FIFO)的数据结构&…

中介子方程二十

X$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXπX$XWXyXWX$XπXWXuXdX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXπX$XWXyXWX$XπXWXuXdX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XdX$XpX$XdX$…

Web前端开发12章:深入探索与实战解析

Web前端开发12章:深入探索与实战解析 在数字化浪潮的推动下,Web前端开发技术日新月异,成为了构建互联网应用的重要基石。本文将以12章的篇幅,从四个方面、五个方面、六个方面和七个方面,深入探索Web前端开发的精髓&am…

【INTEL(ALTERA)】Nios® II无法使用基于 Ubuntu 18.04.5 的 WSL 进行构建

现象 在使用 Ubuntu 18.04.5 构建 WSL 的Nios II处理器时,任何英特尔 Quartus Prime 软件版本都可能会看到此问题。 原因 这是因为在 Nios II Command Shell 中运行命令 “wslpath -u .”时返回值不同。 正常工作:命令返回”。故障:命令返回…

机器学习(V)--无监督学习(一)聚类

根据训练样本中是否包含标签信息,机器学习可以分为监督学习和无监督学习。聚类算法是典型的无监督学习,目的是想将那些相似的样本尽可能聚在一起,不相似的样本尽可能分开。 相似度或距离 聚类的核心概念是相似度(similarity)或距离(distance…