当前位置: 首页 > news >正文

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程序。

相关文章:

java-final 关键字

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

ARM32开发--IIC软实现

知不足而奋进 望远山而前行 目录 文章目录 前言 开发流程 GD32F4软件I2C初始化 GD32F4软件I2C引脚功能 写操作 读操作 总结 前言 在嵌入式系统开发中,软件实现的I2C通信协议扮演着至关重要的角色。本文将深入探讨如何在GD32F4系列微控制器上实现软件I2C功能…...

在有向无环图(DAG)中实现拓扑排序与最短路径和最长路径算法

有向无环图(DAG)是一类非常重要的图结构,广泛应用于任务调度、数据依赖分析等领域。本文将介绍如何在DAG中实现拓扑排序、单源最短路径和单源最长路径算法,并提供完整的Java代码示例。 图结构定义 首先,我们定义一个…...

SQLServer按照年龄段进行分组查询数据

1.按照年龄段对数据进行分组, 将人群分为:青年,中年,老年三种类型,人群类型加上其他分组字段如:性别,进行多条件分组,统计各个年龄段多少人 Select case sex when 1 then ‘男’ when 2 then …...

开放式耳机哪个品牌质量比较好?2024高性价比机型推荐!

随着音乐技术的不断发展,开放式耳机已成为音乐发烧友们的另外一种选择。从最初的简单音质,到如今的高清解析,开放式耳机不断进化升级。音质纯净,佩戴舒适,无论是街头漫步还是家中放松时候,都能带给你身临其…...

Blender骨骼创建

骨骼系统 建立 使用Shift A添加骨骼或在添加|骨架中添加一段骨骼 骨骼的三种模式 -物体模式:做动画,摆人物pose时在该模式 -编辑模式:进行骨骼搭建(选择一段骨骼,然后按E挤出一段骨骼并进行调整) -姿…...

DevExpress WPF中文教程:Grid - 如何完成列和编辑器配置(设计时)?

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

高考完的三个月想自学点编程,有没有什么建议

👆点击关注 获取更多编程干货👆 对于刚刚完成高考的学生来说,无论未来是否选择计算机科学作为专业方向,自学编程技能是一项非常有价值的投资,掌握编程知识能够帮助同学们为将来的学习和科研 实践奠定一个基础。 随着…...

运维开发(DevOps):加速软件交付的关键方法

1. 什么是运维开发 运维开发(DevOps)是将软件开发(Development)与信息技术运维(Operations)的流程整合在一起的实践方法。DevOps的目标是通过增强开发和运维团队之间的协作,提高软件产品的发布…...

Vue前端环境搭建:从四个方面、五个方面、六个方面和七个方面深度解析

Vue前端环境搭建:从四个方面、五个方面、六个方面和七个方面深度解析 在构建Vue.js项目时,搭建一个稳定且高效的前端环境至关重要。这不仅关乎项目的顺利推进,更直接影响开发者的效率和代码质量。本文将从四个方面、五个方面、六个方面和七个…...

农业领域科技查新点提炼方法附案例!

农业学科是人类通过改造和利用生物有机体(植物、动物、微生物等)及各种自然资源(光、热、水、土壤等)生产出人类需求的农产品的过程,人类在这一过程中所积累的科学原理、技术、工艺和技能,统称为农业科学技术,该领域具有研究范围广、综合性强…...

【Bazel入门与精通】 rules之属性

https://bazel.build/extending/rules?hlzh-cn#attributes Attributes An attribute is a rule argument. Attributes can provide specific values to a target’s implementation, or they can refer to other targets, creating a graph of dependencies. Rule-specifi…...

Elementor无需第三方插件实现高级下拉菜单/巨型菜单

使用新的嵌套功能创建美观的菜单和大型菜单。巨型菜单是具有复杂导航结构和独特设计的网站的理想选择。 Elementor-设置-特性-Menu启用 之后再去前端编辑器设计即可,就会有一个新的menu菜单模块了。 这个菜单的下拉则是通过Elementor直接来设计,也就以为…...

【数学】什么是傅里叶变换?什么是离散傅里叶变换?什么是拉普拉斯变换?

文章目录 什么是傅里叶变换?什么是离散傅里叶变换?什么是拉普拉斯变换?背景公式示例题目详细讲解Python代码求解实际生活中的例子 什么是线性时不变系统线性性(Linearity)时不变性(Time-Invariance&#xf…...

opencv安装笔记 各种平台

目录 python安装opencv-python c 麒麟arm系统安装和用法 python安装opencv-python pypi上搜索 Search results PyPI 现在安装是一个版本,大于3.6都可以安装 c 麒麟arm系统安装和用法 参考: ffmpeg rknn麒麟系统 安装 opencv_ffmpeg4 解码示例-CSDN…...

前端开发中的热更新原理

一、什么是热更新 热更新(Hot Module Replacement,HMR)是一种在前端开发中极为重要的技术。它允许开发者在不重新加载整个页面的情况下,实时更新应用程序中的某些模块。简单来说,热更新能让你在开发过程中即时看到代码…...

unix环境高级编程第2版:深入探索UNIX编程的奥秘

unix环境高级编程第2版:深入探索UNIX编程的奥秘 在数字世界的浩瀚海洋中,UNIX环境以其稳定、高效和灵活的特性,一直备受程序员们的青睐。而《unix环境高级编程第2版》这本书,无疑是探索UNIX编程奥秘的绝佳指南。接下来&#xff0…...

力扣42 接雨水

听说字节每人都会接雨水,我也要会哈哈哈 数据结构:数组 算法:核心是计算这一列接到多少雨水,它取决于它左边的最大值和右边的最大值,如下图第三根柱子能接到的雨水应该是第一根柱子高度和第五根柱子高度的最小值减去第…...

【代码随想录】【算法训练营】【第35天】[134]加油站 [135]分发糖果 [860]柠檬水找零 [406]根据身高重建队列

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 35,连休两天~ 题目详情 [134] 加油站 题目描述 134 加油站 解题思路 前提:数组 思路:全局贪心算法:最小累加剩余汽油为负数,说明…...

Talk|新加坡国立大学贾鑫宇:适用于高自由度机器人的运动控制器

本期为TechBeat人工智能社区第600期线上Talk。 北京时间6月13日(周四)20:00,新加坡国立大学博士生—贾鑫宇的Talk已经准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “适用于高自由度机器人的运动控制器”,向大家系统地介绍了如何通…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...