Java——final用法

news2024/11/13 4:10:37

一、final 介绍

在Java中,final关键字有多种用途,可以用来修饰变量、方法和类。它的主要作用是确保所修饰的内容不可改变。

二、final 用法

1、修饰变量

1)局部变量

当一个局部变量被声明为final时,它的值在初始化后就不能被改变。这意味着你只能对其赋值一次。

public class Example {
	public static void main(String[] args) {
		final int a = 0;
		a++;// 这里会报错
	}
}

2)成员变量

当一个成员变量被声明为final时,它必须在定义时或者在构造器中或者在实例代码块中被初始化(如果在定义时或实例代码块中初始化了,则在构造器中就不能再次初始化了),初始化之后就不能再被改变。

class FinalVar {
	private final int finalVar = 0;// 在定义时初始化

}

class FinalVar {
	private final int finalVar;// 定义时不初始化

	public FinalVar(int finalVar) {
		this.finalVar = finalVar;// 在构造器中初始化
	}
}

class FinalVar {
	private final int finalVar;

	{
		finalVar = 0;// 在实例代码块中初始化
	}
}

如果是按照下面这样写,就会报错:

class FinalVar {
	private final int finalVar = 0;// 定义时初始化

	public FinalVar(int finalVar) {
		this.finalVar = finalVar;// 在构造器中再次赋值,这里会报错
	}
}

因为 final 修饰的属性只能进行一次初始化,然后就不能改变了。

总结一下,也就是说对于被 final 修饰的实例属性,只能在以下三种位置的一种中被初始化:

  1. 定义时初始化
  2. 实例代码块中初始化
  3. 构造器中初始化

3)静态变量

final关键字可以与static一起使用来修饰类变量,通常用于创建常量。此时变量值在类被加载时初始化,并且其值不能被改变。

class FinalVar {
	public static final double PI = 3.14;// 在声明时初始化,然后它将在类加载时被初始化

}

class FinalVar {
	public static final double PI;
	
	static {
		PI = 3.14;// 在静态代码块中初始化,然后它将在类加载时被初始化
	}
}

不能在构造器中初始化。

总结一下,对于被 final 修饰的静态属性,只能在以下两种位置的一种中初始化:

  1. 定义时
  2. 静态代码块中

2、修饰方法

当一个方法被声明为final时,它不能被子类重写。如果你希望一个方法不能被子类重写时,可以使用 final 修饰这个方法。

虽然这个被 final 修饰的方法不能被子类重写,但是可以被子类继承下去。

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

class SubClass extends SuperClass {
	public void display() { // 错误: 不能重写final方法
		System.out.println("Trying to override.");
	}
}

3、修饰类

当一个类被声明为final时,它不能被继承。当你不想让一个类被继承时,可以使用 final 修饰这个类。

虽然这个类不能被继承,但是可以被实例化。

final class FinalClass {

}

class SubClass extends FinalClass {
	//这里会报错,没法继承一个final修饰的类
}

4、修饰方法参数

在方法参数中使用final,意味着在方法内部不能改变该参数的引用。对于基本数据类型,值不能变;对于对象引用,引用不能变,但对象本身的状态可以改变。

public void method(final int parameter) {
    parameter = 10; // 错误: 不能对final参数赋值
}

对于 final 修饰方法参数其实就相当于 final 修饰局部变量。

三、补充

  1. 如果一个类已经被 final 修饰了,那它的方法就没有必要再用 final 修饰了。
  2. final 不能修饰构造方法(构造器)。
  3. 一些常见的 final 类:对于包装类(Integer, Double, Boolean...)以及 String 类都是 final 类。

使用 final 修饰 static 成员变量,使用这个静态成员变量的时候,不会导致类加载,这是一个底层的优化。

public class Example {
	public static void main(String[] args) {
		System.out.println(FinalVar.PI);
	}
}

class FinalVar {
	public static final double PI = 3.14;

	static {
		// 这里用来测试是否进行了类加载
		System.out.println("静态代码块执行~");
	}
}

运行结果:

运行结果只有一个 3.14,没有静态代码块的执行,所以没有进行类加载。

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

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

相关文章

科技改变生活:最新智能开关、调光器及插座产品亮相

根据QYResearch调研团队的最新力作《欧洲开关、调光器和插座市场报告2023-2029》显示,预计到2029年,欧洲开关、调光器和插座市场的规模将攀升至57.8亿美元,并且在接下来的几年里,将以4.2%的复合年增长率(CAGR&#xff…

走进算法大门---双指针问题(一)

一.双指针算法介绍 概念:双指针是指在遍历数据结构(如数组、链表等)时使用两个指针,通过特定的移动规则来解决问题。这两个指针可以同向移动,也可以相向移动。 同向双指针:常用于解决需要两个位置信息的问…

用 Python 从零开始创建神经网络(一)

用 Python 从零开始创建神经网络(一) 引言1. A Single Neuron:Example 1代码部分: Example 2代码部分: 2. A Layer of Neurons:Example 1代码部分: 引言 本教程专为那些对神经网络已有基础了解…

深度学习⑨GANs

Discriminative and Generative Models Deep learning中主要两种模型 判别模型专注于从输入预测输出,例如分类任务。学习数据点和标签之间的特征 生成模型则试图理解数据是如何产生的,能够生成新的数据样本。理解数据分布和是否可以被预测 Quiz time: Discriminative mo…

[产品管理-58]:安索夫矩阵矩阵帮助创业者确定研发出来的产品在市场中定位策略

目录 一、提出背景 二、核心思想与结构 三、应用背景与领域 四、实践案例 安索夫矩阵(Ansoff Matrix),也被称为产品/市场方格或成长矢量矩阵,其应用背景可以从以下几个方面进行详细阐述: 一、提出背景 安索夫矩阵…

物联网对商业领域的影响

互联网彻底改变了通信方式,并跨越了因地理障碍造成的人与人之间的鸿沟。然而,物联网(IoT)的引入通过使设备能够连接到互联网,改变了设备的功能。想象一下,你的闹钟连接到互联网,并且能够用你的声…

微信小程序——用户隐私保护指引填写(详细版)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

LED点阵显示(Proteus 与Keil uVision联合仿真)(点阵字模提取)

点阵字模提取: https://pan.baidu.com/s/1DZSeLyD_SUkaHRgTm26o-A 提取码: 1111 一、LED点阵显示器结构 点亮点阵中一个发光二极管条件:对应行为高电平,对应列为低电平。如在很短时间内依次点亮很多个发光二极管,LED点阵就可显示…

JDBC学习记录

文章目录 一、JDBC简介1.1、 JDBC概念1.2、 JDBC本质1.3、 JDBC好处 二、JDBC快速入门2.1、 编写代码步骤2.2、 代码示例 三、JDBC API详解3.1、DriverManager3.1.1、注册驱动3.1.2、获取连接 3.2、Connection3.2.1、获取执行对象3.2.2、事务管理 3.3、Statement3.3.1、执行DDL…

[Linux] 进程等待 | 进程替换

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 我有一个朋友&#x…

运用Agent搭建“狼人杀”游戏服务器端!

背景 从23年开年以来,大模型引爆了各行各业。去年比较出圈的是各类文生图的应用,比如Stable Diffusion。网上可以看到各类解释其背后的原理和应用的文章。另外一条平行线,则是文生文的场景。受限于当时LLM(大语言模型&#xff09…

笔记分享 |【黑马Pink老师】Web APIs

Web API 基本认知 介绍 严格意义上讲,我们在 JavaScript 阶段学习的知识绝大部分属于 ECMAScript 的知识体系; ECMAScript 简称 ES 它提供了一套语言标准规范,如变量、数据类型、表达式、语句、函数等语法规则都是由 ECMAScript 规定的&am…

Android Glide动态apply centerCropTransform(),transition withCrossFade动画,Kotlin

Android Glide动态apply centerCropTransform(),transition withCrossFade动画,Kotlin import android.graphics.Bitmap import android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.Glide import …

大数据学习10之Hive高级

1.Hive高级 将大的文件按照某一列属性进行GROUP BY 就是分区,只是默认开窗存储; 分区是按行,如一百行数据,按十位上的数字分区,则有十个分区,每个分区里有十行; 分桶是根据某个字段哈希对桶数取…

嵌入式新手必读好文,常见传感器类型中,LM393的作用,及模块原理(看不懂来问我)!!!

目录 序言 常感器基本知识 常见传感器原理 D0引脚的作用 如何设置电位器 欢迎指正,希望对你,有所帮助,禁止搬运!!! 前言:编写不易,请问搬运,仅供学习,有…

机器学习2_支持向量机_线性可分——MOOC

目录 定义 线性可分(Linear Separable) 线性不可分(Nonlinear Separable) 数学化定义 问题描述 优化问题 线性可分定义 假定训练样本集是线性可分的 1、最小化(Minimize): 2、限制条件…

git 工具原理

git 目录 git git的使用 了解git的三个区域 具体操作 如何下载别人上传到git的工程 -- 可以参考菜鸟教程,包括安装配置git Git 安装配置 | 菜鸟教程 -- Git 是一种分布式版本控制系统,用于管理软件项目的源代码。它是由 Linux 之父 Linus Torval…

MAN TruckScenes数据集:第一个用于自动驾驶卡车的大规模多模式数据集。

2024-07-15,为了推进自动驾驶卡车技术的发展并确保其在公共道路上的安全性,由慕尼黑工业大学和MAN Truck & Bus SE联合创建了MAN TruckScenes数据集。数据集首次为研究社区提供了一个包含丰富环境条件下的卡车特定挑战,如拖车遮挡、新型传感器视角和…

基于微信小程序的实习管理系统(附源码,文档)

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

mp3格式音频怎么做成二维码?扫码获取音频文件的制作方法

随着二维码的广泛使用,现在很多内容都会通过生成二维码的方式来传输内容,通过这种方式可以更快捷的实现内容分享,简化其他人获取内容的流程,有效提高效率。音频是目前常见的一种内容分享方式,比如录音、听力、音乐等类…