final-关键字

一、final修饰的类不能被继承

当final修饰一个类时,表明这个类不能被其他类继承。例如,在 Java 中,String类就是被final修饰的,这保证了String类的不可变性和安全性,防止其他类通过继承来改变String类的行为。

final class MyFinalClass {// 类的成员和方法
}// 以下代码会报错,因为不能继承final类
class Subclass extends MyFinalClass {
}

二、final修饰的方法不能被覆盖(重写)

用final修饰的方法不能在子类中被覆盖(重写)。这可以防止子类意外地改变父类中关键方法的行为,保证了方法的功能和语义在继承体系中的稳定性。

class Parent {public final void finalMethod() {System.out.println("这是父类的final方法");}
}class Child extends Parent {// 以下代码会报错,不能覆盖final方法@Overridepublic void finalMethod() {System.out.println("尝试覆盖父类的final方法");}
}

三、final修饰的变量,一旦赋值不能重新赋值

  • 基本数据类型final修饰的基本数据类型变量,一旦赋值就不能再重新赋值。例如:
    final int num = 10;
    num = 20; // 这行代码会报错,不能重新赋值给final变量

final int k;// 首次初始化时可以的。k = 200;// 再次重新赋值是不允许的,因为final的。//k = 300;
  • 引用数据类型
    • final修饰的引用变量,一旦指向某个对象后,就不能再指向其他对象,但指向的对象内部的数据是可以修改的。例如:

示例1:

final StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 合法,修改对象内部的数据
sb = new StringBuilder("New"); // 这行代码会报错,不能重新赋值给final引用变量

示例2:

Product类:

public class Product {private String name;private double price;public Product() {}public Product(String name, double price) {this.name = name;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public void display(){System.out.println("商品名称:" + this.name + ",商品价格:" + this.price);}
}

ProductTest类:

public class ProductTest {public static void main(String[] args) {// 创建商品对象final Product pro = new Product("BMW535li", 10.0);pro.display();// 报错//pro = new Product("BenzE300L", 20.0);// 指向的对象的内部内存可以修改。没问题。pro.setName("BenzE300L");pro.setPrice(20.0);pro.display();}
}

运行结果:

四、final修饰的实例变量必须在对象初始化时手动赋值

final修饰的实例变量确实必须在对象初始化时手动赋值,这是 Java 语言的规定,主要有以下几种实现方式及相关要点:

1.在定义时直接赋值

可以在声明final实例变量的同时直接为其赋初始值,这是一种较为常见和直观的方式。

class MyClass {// 在定义时直接给final实例变量赋值final int instanceVar = 10; // 其他方法和成员
}

2.在构造函数中赋值

final修饰的实例变量。必须在构造方法执行完之前手动赋上值。(不允许采用系统默认值) 一般不存在这种情况。

示例1:

class MyClass {final int instanceVar; public MyClass() {// 在构造函数中给final实例变量赋值instanceVar = 10; }// 其他方法和成员
}

示例2:

public class User {final String name;final int age;public User(String name, int age) {this.name = name;this.age = age;}
}
  • 如果一个类有多个构造函数,那么每个构造函数都必须为final实例变量赋值,以保证无论通过哪个构造函数创建对象,final实例变量都能得到正确的初始化。
class MyClass {final int instanceVar; public MyClass() {instanceVar = 10; }public MyClass(int value) {// 在另一个构造函数中也给final实例变量赋值instanceVar = value; }// 其他方法和成员
}

3.在实例初始化块中赋值

还可以使用实例初始化块来为final实例变量赋值,实例初始化块会在构造函数执行之前执行,也能确保final实例变量在对象初始化时被赋值。

class MyClass {final int instanceVar; {// 在实例初始化块中给final实例变量赋值instanceVar = 10; }// 其他方法和成员
}

如果final修饰的实例变量没有在上述这些时机进行手动赋值,编译器就会报错,提示变量未初始化。这一规则保证了final实例变量在使用前总是有一个确定的值,体现了final关键字所代表的 “不可变” 语义,有助于提高程序的稳定性和可维护性,避免出现因变量未初始化或意外修改而导致的错误。

五、final修饰的实例变量一般和static联合使用:称为常量

当final修饰的实例变量和static联合使用时就形成了常量,以下是关于它的详细介绍:

定义与特点

用final和static修饰的变量被称为类常量,它属于类本身,而不是类的某个具体实例。在内存中,类常量只有一份存储,被所有该类的实例共享。并且由于final的作用,一旦被赋值,其值在程序运行期间就不能再被修改。

命名规范

按照 Java 的命名规范,常量通常使用大写字母命名,多个单词之间用下划线分隔,这样可以清楚地表明它是一个常量,与其他变量区分开来。例如:

public class MathConstants {public static final double PI = 3.141592653589793;public static final int MAX_VALUE = 100;
}

应用场景

数学和物理常量:在科学计算或数学相关的程序中,经常会用到一些固定的数学或物理常量,如圆周率PI、重力加速度G等,将它们定义为常量可以方便在代码中使用。

配置参数:在应用程序中,可能会有一些配置参数,如数据库连接字符串、系统默认设置等,将这些参数定义为常量可以在整个应用程序中统一使用,并且方便修改和维护。

状态码和枚举值:在网络通信或系统交互中,常常会用到一些固定的状态码或枚举值来表示不同的状态或类型,将它们定义为常量可以使代码更加清晰和易于管理。例如

public class HttpStatusCodes {public static final int OK = 200;public static final int BAD_REQUEST = 400;public static final int INTERNAL_SERVER_ERROR = 500;
}

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

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

相关文章

51单片机 01 LED

一、点亮一个LED 在STC-ISP中单片机型号选择 STC89C52RC/LE52RC;如果没有找到hex文件(在objects文件夹下),在keil中options for target-output- 勾选 create hex file。 如果要修改编程 :重新编译-下载/编程-单片机重…

知识库建设与知识管理实践对企业发展的助推作用探索

内容概要 在当今瞬息万变的商业环境中,知识库建设与知识管理实践日益成为企业发展的重要驱动力。知识库作为组织内信息和知识的集成,起着信息存储、整理和共享的关键作用。通过有效的知识库建设,企业不仅能够提升员工获取信息的便利性&#…

【Pytorch和Keras】使用transformer库进行图像分类

目录 一、环境准备二、基于Pytorch的预训练模型1、准备数据集2、加载预训练模型3、 使用pytorch进行模型构建 三、基于keras的预训练模型四、模型测试五、参考 现在大多数的模型都会上传到huggface平台进行统一的管理,transformer库能关联到huggface中对应的模型&am…

如何使用 DeepSeek 和 Dexscreener 构建免费的 AI 加密交易机器人?

我使用DeepSeek AI和Dexscreener API构建的一个简单的 AI 加密交易机器人实现了这一目标。在本文中,我将逐步指导您如何构建像我一样的机器人。 DeepSeek 最近发布了R1,这是一种先进的 AI 模型。您可以将其视为 ChatGPT 的免费开源版本,但增加…

ArkTS渲染控制

文章目录 if/else:条件渲染ArkUI通过自定义组件的build()函数和@Builder装饰器中的声明式UI描述语句构建相应的UI。在声明式描述语句中开发者除了使用系统组件外,还可以使用渲染控制语句来辅助UI的构建,这些渲染控制语句包括控制组件是否显示的条件渲染语句,基于数组数据快…

potplayer字幕

看视频学习,实时字幕可以快速过滤水字数阶段,提高效率,但是容易错过一些信息。下面就是解决这一问题。 工具ptoplayer 一.生成字幕 打开学习视频,右键点击视频画面,点选字幕。勾选显示字幕。点选创建有声字幕&#…

deepseek的两种本地使用方式

总结来说 ollama是命令行 GPT4ALL桌面程序。 然后ollamaAnythingLLM可以达到桌面或web的两种接入方式。 一. ollama和deepseek-r1-1.5b和AnythingLLM 本文介绍一个桌面版的deepseek的本地部署过程,其中ollama可以部署在远程。 1. https://www.cnblogs.com/janeysj/p…

海外问卷调查渠道查,如何影响企业的运营

我们注意到,随着信息资源和传播的变化,海外问卷调查渠道查已发生了深刻的变化。几年前,市场调研是业内专家们的事,即使是第二手资料也需要专业人士来完成;但如今的因特网和许许多多的信息数据库,使每个人都…

TensorFlow简单的线性回归任务

如何使用 TensorFlow 和 Keras 创建、训练并进行预测 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 8.完整代码 1. 数据准备与预处理 我们将使用一个简单的线性回归问题,其中输入特征 x 和标…

当卷积神经网络遇上AI编译器:TVM自动调优深度解析

从铜线到指令:硬件如何"消化"卷积 在深度学习的世界里,卷积层就像人体中的毛细血管——数量庞大且至关重要。但鲜有人知,一个简单的3x3卷积在CPU上的执行路径,堪比北京地铁线路图般复杂。 卷积的数学本质 对于输入张…

MySQL(高级特性篇) 13 章——事务基础知识

一、数据库事务概述 事务是数据库区别于文件系统的重要特性之一 (1)存储引擎支持情况 SHOW ENGINES命令来查看当前MySQL支持的存储引擎都有哪些,以及这些存储引擎是否支持事务能看出在MySQL中,只有InnoDB是支持事务的 &#x…

影视文件大数据高速分发方案

在当今的数字时代,影视行业的内容创作和传播方式经历了翻天覆地的变化。随着4K、8K高清视频的普及,以及虚拟现实(VR)和增强现实(AR)技术的发展,影视文件的数据量正以前所未有的速度增长。这就要求行业内的参与者必须拥有高效的大数据传输解决…

C语言教程——文件处理(2)

目录 前言 一、顺序读写函数(续) 1.1fprintf 1.2fscanf 1.3fwrite 1.4fread 二、流和标准流 2.1流 2.2标准流 2.3示例 三、sscanf和sprintf 3.1sprintf 3.2sscanf 四、文件的随机读写 4.1fseek 4.2ftell 4.3rewind 五、文件读取结束的…

建表注意事项(2):表约束,主键自增,序列[oracle]

没有明确写明数据库时,默认基于oracle 约束的分类 用于确保数据的完整性和一致性。约束可以分为 表级约束 和 列级约束,区别在于定义的位置和作用范围 复合主键约束: 主键约束中有2个或以上的字段 复合主键的列顺序会影响索引的使用,需谨慎设计 添加…

线性回归的损失和优化02

线性回归的损失和优化 学习目标 知道线性回归中损失函数知道使用正规方程对损失函数优化的过程知道使用梯度下降法对损失函数优化的过程 假设刚才的房子例子,真实的数据之间存在这样的关系: 真实关系: 真实房子价格 0.02中心区域的距离 0.…

年化18%-39.3%的策略集 | backtrader通过xtquant连接qmt实战

原创内容第785篇,专注量化投资、个人成长与财富自由。 大年初五,年很快就过完了。 其实就是本身也只是休假一周,但是我们赋予了它太多意义。 周五咱们发布发aitrader v4.1,带了backtraderctp期货的实盘接口: aitra…

【数据结构】_链表经典算法OJ(力扣/牛客第二弹)

目录 1. 题目1:返回倒数第k个节点 1.1 题目链接及描述 1.2 解题思路 1.3 程序 2. 题目2:链表的回文结构 2.1 题目链接及描述 2.2 解题思路 2.3 程序 1. 题目1:返回倒数第k个节点 1.1 题目链接及描述 题目链接: 面试题 …

成绩案例demo

本案例较为简单,用到的知识有 v-model、v-if、v-else、指令修饰符.prevent .number .trim等、computed计算属性、toFixed方法、reduce数组方法。 涉及的功能需求有:渲染、添加、删除、修改、统计总分,求平均分等。 需求效果如下&#xff1a…

git基础使用--4---git分支和使用

文章目录 git基础使用--4---git分支和使用1. 按顺序看2. 什么是分支3. 分支的基本操作4. 分支的基本操作4.1 查看分支4.2 创建分支4.3 切换分支4.4 合并冲突 git基础使用–4—git分支和使用 1. 按顺序看 -git基础使用–1–版本控制的基本概念 -git基础使用–2–gti的基本概念…

Kafka下载

一、Kafka下载 下载地址:https://kafka.apache.org/downloads 二、Kafka安装 因为选择下载的是 .zip 文件,直接跳过安装,一步到位。 选择在任一磁盘创建空文件夹(不要使用中文路径),解压之后把文件夹内容…