final关键字

final关键字

  • 基本介绍
  • final使用细节

基本介绍


final 中文意思:最后的,最终的。

final 可以修饰类、属性、方法和局部变量。

在某些情况下会使用到final:

   1) 当不希望类被继承时,可以用 final 修饰;

// 如果我们要求 A类 不能被其他类继承
// 可以使用 final 修饰 A类
final class A{}class B extends A{}	// 会报错

   2) 当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字修饰;

class  C{// 如果我们要求 hi 不能被子类重写// 可以使用 final 修饰 hi 方法public final void  hi(){}
}class D extends C{@Overridepublic void hi() {	// 会报错System.out.println("重写了C类的hi方法...");}
}

   3) 当不希望类的的某个属性的值被修改,可以用final修饰;

public class Final01 {public static void main(String[] args) {E e = new E();e.GOODS_PRICE = 75.6;	// 会报错}
}// 当不希望类的的某个属性的值被修改,可以用final修饰
class E{public final double GOODS_PRICE = 99.5;
}

   4) 当不希望某个局部变量被修改,可以使用final修饰。

// 当不希望某个局部变量被修改,可以使用final修饰
class F{public void TAX_RATE (){// 这时 RATE 也称为局部变量final double RATE = 0.09;RATE = 0.1; // 会报错System.out.println("RATE = " + RATE);}
}

final使用细节

  1) final修饰的属性又叫常量,一般用 XX_XX_XX来命名

  2) final修饰的属性在定义时,必须赋初值,并且以后不能再修改,赋值可以在如下位置之一【 选择一个位置赋初值即可】:
     ① 定义时:如 public final double GOODS_PRICE = 99.5;
     ② 在构造器中
     ③ 在代码块中

class AA{// ① 定义时:如 public final double price = 99.5;// ② 在构造器中// ③ 在代码块中public final double GOODS_PRICE = 99.5;public final double GOODS_PRICE2;public final double GOODS_PRICE3;public AA(){  // 在构造器中赋值GOODS_PRICE2 = 66.6;}{   // 在代码块中赋值GOODS_PRICE3 = 77.7;}
}

  3) 如果final修饰的属性是静态的,则初始化的位置只能是:
     ① 定义时
     ② 在静态代码块,不能在构造器中赋值

class BB{// 如果final修饰的属性是静态的,则初始化的位置只能是:// ① 定义时// ② 在静态代码块,不能在构造器中赋值public static final double GOODS_PRICE = 99.5;public static final double GOODS_PRICE2;public static final double GOODS_PRICE3;public BB(){  // 会报错GOODS_PRICE2 = 66.6;}static {	// 在静态代码块中赋值GOODS_PRICE3 = 77.7;}
}

  4) final类不能继承,但是可以实例化对象;

  5) 含有final方法,则该方法虽然不能重写,但是可以被继承;

public class Final02 {public static void main(String[] args) {EE ee = new EE();	// final类不能继承,但是可以实例化对象// 含有final方法,则该方法虽然不能重写,但是可以被继承new DD().sout();}
}class CC{public final void sout(){System.out.println("sout()方法...");}
}class DD extends CC{
}final class EE{   
}

  6) 一般来说,如果一个类已经是final类了,就没有必要再将方法修饰成final方法;

  7) final不能修饰构造方法(即构造器);

  8) final和static 往往搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理;

public class Final03 {public static void main(String[] args) {System.out.println(AAA.num);}
}class AAA{public static int num = 1000;static {System.out.println("AAA 静态代码块被执行...");}
}

运行结果为:
在这里插入图片描述
如果 num 不用 final 修饰,则运行结果为:
在这里插入图片描述

  9) 包装类(Integer、Double、Float、Boolean等都是final),String也是final类。

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

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

相关文章

Python--成员方法、@staticmethod将成员方法静态化、self参数释义

在 Python 中,成员方法是指定义在类中的函数,用于操作类的实例对象。成员方法通过第一个参数通常命名为 self,用来表示调用该方法的实例对象本身。通过成员方法,可以实现类的行为和功能。 成员方法的定义 在类中定义成员…

【Linux】Linux上代码的编译与调试

目录 Linux上常用的编译器gcc\g 如何使用gcc/g 编译过程: 如何使用gcc编译? 进行预处理 进行编译 进行汇编 进行链接 函数库 函数库的分类 gcc选项 Linux调试器-gdb的使用 gdb的常用参数 Linux项目自动化构建工具make/Makefile 原理 利用…

MYSQL日志 redo_log更新流程 bin_log以及bin_log数据恢复

Redo_log写入策略 Redo log的Innodb_flush_log_at_trx_commit:: 这个参数有三个取值 取值为0:每次事务提交时,只是把redo_log留在 redo log buffer中,宕机会丢失数据; 取值为1(默认值):每次事…

1.中医学习-总论

目录 1.为什么要学中医 2.什么是中医 介绍 中医例子1: 中医例子2: 中医最高境界“大道至简” 中医讲究的是本质 中医核心:阴阳、表里、寒热、虚实 ​编辑医不叩门 3.阴阳 1.一天中的阴阳 2.一年中的阴阳 3.阴阳之间的关系 4.阴阳四季的变化 …

解决:visio导出公式为pdf图片乱码问题

今天需要将Visio编辑好的以后的图输出pdf,但是点击保存后公式部分一直乱码,如下图所示 保存为pdf后会变成: 解决方案:保存时点击文件下方的快速打印,存到桌面,不要直接点击保存

代码随想录算法训练营第二十五天|216.组合总和III,17.电话号码的字母组合

216.组合总和III 题目 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 说明: 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 示例 2: 输入…

24计算机考研调剂 | 【官方】山东师范大学(22自命题)

山东师范大学2024年拟接收调剂 考研调剂信息 调剂专业目录如下: 计算机技术(085404)、软件工程(085405) 补充内容 我校2024年硕士研究生调剂工作将于4月8日教育部“中国研究生招生信息网”(https://yz.ch…

深入了解JVM底层原理

一、JVM内存结构 1、方法区:存储编译后的类、常量等(.class字节码文件) 2、堆内存:存储对象 3、程序计数器:存储当前执行的指令地址(计算机处理器(CPU)正在执行的下一条指令在内存…

openwrt下部署clouddrive2

在启动项上增加启动参数 在exit 0前面增加 mount --make-shared /mnt/data480g注意,后面的/mnt/data480g要替换成你设置的共享映射券。 拉取镜像 docker pull cloudnas/clouddrive2启动镜像 一定要用ssh在后台用docker run命令启动,因为openwrt前台…

函数-Python

师从黑马程序员 函数初体验 str1"asdf" str2"qewrew" str3"rtyuio" def my_len(data):count0for i in data:count1print(f"字符串{data}的长度是{count}")my_len(str1) my_len(str2) my_len(str3) 函数的定义 函数的调用 函数名&a…

基于Java的大学计算机课程管理平台(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

面试笔记——Redis(缓存击穿、缓存雪崩)

缓存击穿 缓存击穿(Cache Breakdown): 当某个缓存键的缓存失效时(如,过期时间),同时有大量的请求到达,并且这些请求都需要获取相同的数据,这些请求会同时绕过缓存系统&a…

【GameFramework框架内置模块】8、文件系统(File System)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q7…

登录-前端部分

登录表单和注册表单在同一个页面中,通过注册按钮以及返回按钮来控制要显示哪个表单 一、数据绑定和校验 (1)绑定数据,复用注册表单的数据模型: //控制注册与登录表单的显示, 默认false显示登录 true时显…

【MySQL】4. 表的操作

表的操作 1. 创建表 语法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明: field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c…

java方法的引用传递和值传递

1、方法的值参数传递 下面代码,它会在控制台输出什么? public class ArrayTest {public static void main(String[] args) {int number 100;System.out.println(number);change(number);System.out.println(number);}public static void change(int n…

vue3使用qrcodejs2-fix生成背景透明的二维码

qrcodejs官方仓库:GitHub - davidshimjs/qrcodejs: Cross-browser QRCode generator for javascript qrcodejs2-fix 是一个用于生成QR码的JavaScript库,使用的时候先安装,然后通过设置前景色和背景色可以控制显示的二维码效果。想生成透明背…

手撕算法-二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。数据范围:二叉树的节点数 0≤_n_≤1000 , 二叉树每个节点的值 0≤_val_≤1000要求: 空间复杂度 O(n) 。本题也有原地操作,即空间复杂度 O(1) 的解法&#xff0c…

士兵排列问题

解法一&#xff1a; deque实现队头入队和队尾入队即可得到编号排列&#xff0c;每个士兵有二个属性&#xff1a;编号、能力值。 #include<iostream> #include<algorithm> #include<deque> #include<vector> using namespace std; #define endl \n st…

汇率与政治的关系?Anzo Capital实例举证

投资者在使用特定货币对交易时&#xff0c;交易者应关注交易所用货币国家的主要政治新闻。众所周知&#xff0c;政治和金融密切相关&#xff0c;因此重要政治消息的发布会对汇率产生强烈影响。 Anzo Capital实例举证&#xff1a;汇率与政治的关系。 其中一个例子&#xff0c…