Java中的final变量、final方法和final类

Java中的final变量、final方法和final类1 final 变量 final 关键字可用于变量声明 一旦该变量被设定 就不可以再改变该变量的值 通常 由 final 定义的变量为常量 例如 在类中定义 PI 值 可以使用如下语句 finaldoubleP 3 14 在 Java 中定义全局常量 通常使用 publicstatic 修饰 这样的常量只能在定义是被赋值 publicstatic

1、final变量

final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。通常,由final定义的变量为常量。例如,在类中定义PI值,可以使用如下语句:

final double PI=3.14;

在Java中定义全局常量,通常使用public static final修饰,这样的常量只能在定义是被赋值。

public static final double PI_VAULE = 3.14;

规范:被定义为final的常量定义时需要使用大写字母命名,并且中间使用下划线进行连接。

常量示例:

import java.util.Random; class Test { int i = 0; } / * 常量示例 * * @author pan_junbiao * */ public class FinalData { static Random rand = new Random(); private final int VALUE_1 = 9; // 声明一个final常量 private static final int VALUE_2 = 10; // 声明一个final、static常量 private final Test test = new Test(); // 声明一个final引用 private Test test2 = new Test(); // 声明一个不是final的引用 private final int[] a = { 1, 2, 3, 4, 5, 6 }; // 声明一个定义为final的数组 private final int i4 = rand.nextInt(20); private static final int i5 = rand.nextInt(20); public String toString() { return "i4值:" + i4 + " i5值:" + i5 + " "; } public static void main(String[] args) { FinalData data = new FinalData(); // 报错:不能改变定义为final的常量值 // data.VALUE_1 = 8; // 报错:不能改变定义为final的常量值 // data.VALUE_2 = 9; // 报错:不能将定义为final的引用指向其他引用 // data.test = new Test(); // 正确: 可以对指定为final的引用中的成员变量赋值 data.test.i = 1; // 正确: 可以将没有定义为final的引用指向其他引用 data.test2 = new Test(); // 报错:不能对定义为final的数组赋值 // int b[] = { 7, 8, 9 }; // data.a = b; // 但是final的数组中的每一项内容是可以改变的 for (int i = 0; i < data.a.length; i++) { data.a[i] = 9; } System.out.println(data); System.out.println("data2"); System.out.println(new FinalData()); } }

执行结果:

Java中的final变量、final方法和final类 

从上述执行结果中可以发现i5的值是相同的。

全局常量:

我们知道一个被定义为final的对象引用只能指向唯一一个对象,不可以将它再指向其它对象,但是一个对象的值却是可以改变的,那么为了使一个常量真正做到不可更改,可以将常量声明为static final。

示例:在项目中创建FinalStaticData类,在该类中创建Random类的对象,在主方法中分别输出类中定义的final变量a1与a2。

import static java.lang.System.out; import java.util.Random; / * FinalStaticData类 * * @author pan_junbiao * */ public class FinalStaticData { private static Random rand = new Random(); // 实例化一个Random类对象 // 随机产生0~10之间的随机数赋予定义为final的a1 private final int a1 = rand.nextInt(10); // 随机产生0~10之间的随机数赋予定义为static final的a2 private static final int a2 = rand.nextInt(10); public static void main(String[] args) { FinalStaticData fdata = new FinalStaticData(); // 实例化一个对象 // 调用定义为final的a1 out.println("重新实例化对象调用a1的值:" + fdata.a1); // 调用定义为static final的a2 out.println("重新实例化对象调用a2的值:" + fdata.a2); // 实例化另外一个对象 FinalStaticData fdata2 = new FinalStaticData(); out.println("重新实例化对象调用a1的值:" + fdata2.a1); out.println("重新实例化对象调用a2的值:" + fdata2.a2); } }

运行结果:

 Java中的final变量、final方法和final类

从本示例运行结果中可以看出,定义为final的常量不是恒定不变的,将随机数赋予定义为final的常量,可以做到每次运行程序时改变a1的值。但是a2与a1不同,由于它被声明为static final形式,所以在内存中为a2开辟了一个恒定不变的区域,当再次实例化一个FinalStaticData对象时,仍然指向a2这块内存区域,所以a2的值保存不变。a2是在装载时被初始化,而不是每次创建新对象时被初始化;而a1会重新实例化对象时被更改。

最后总结一下在程序中final数据可以出现的位置,如下程序。

/ * 总结一下在程序中final数据可以出现的位置 * * @author pan_junbiao * */ public class FinalDataTest { // final成员变量不可更改 final int VALUE_ONE = 6; // 在声明final成员变量时没有赋值,称为空白final final int BLANK_FINALVAULE; // 在构造方法中为空白final赋值 public FinalDataTest() { BLANK_FINALVAULE = 8; } // 设置final参数,不可以改变参数x的值 int doIt(final int x) { return x + 1; } // 局部变量定义为final,不可以改变i的值 void doSomething() { final int i = 7; } }

 

2、final方法

首先,我们应该了解定义为final的方法不能被重写

将方法定义为final类型可以防止任何子类修改该类的定义与实现方式,同时定义为final的方法执行效率要高于非final方法。在修饰权限中曾经提到过private修饰符,如果一个父类的某个方法被设置为private修饰符,子类将无法访问该方法,自然无法覆盖该方法,所以一个定义为private的方法隐式被指定为final类型,这样无须将一个定义为private的方法再定义为final类型。

语法:

private final void test() { }

 

3、final类

定义为final的类不能被继承。

如果希望一个类不允许任何类继承,并且不允许其他人对这个类有任何改动,可以将这个类设置为final形式。

final类的语法如下:

final 类名{}

如果将某个类设置为final形式,则类中的所有方法都被隐式设置为final形式,但是final类中的成员变量可以被定义为final或非final形式。

示例:在项目中创建FinalClass类,在类中定义doit()方法和变量a,实现在主方法中操作变量a自增。

/ * 定义final类 * * @author pan_junbiao * */ final class FinalClass { int a = 3; void doit() { } public static void main(String args[]) { FinalClass f = new FinalClass(); f.a++; System.out.println(f.a); // 结果:4 } }

 

4、总结

下面总结了一些使用final关键字的好处:

(1)final关键字提高了性能。JVM和Java应用都会缓存final变量。

(2)final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。

(3)使用final关键字,JVM会对方法、变量及类进行优化。

不可变类:

创建不可变类要使用final关键字。不可变类是指它的对象一旦被创建了就不能被更改了。String是不可变类的代表。不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。

关于final的重要知识点:

(1)final关键字可以用于成员变量、本地变量、方法以及类。

(2)final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。

(3) 你不能够对final变量再次赋值。

(4)本地变量必须在声明时赋值。

(5)在匿名类中所有变量都必须是final变量。

(6)final方法不能被重写。

(7)final类不能被继承。

(8)final关键字不同于finally关键字,后者用于异常处理。

(9)final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。

(10)接口中声明的所有变量本身是final的。

(11)final和abstract这两个关键字是反相关的,final类就不可能是abstract的。

(12)final方法在编译阶段绑定,称为静态绑定(static binding)。

(13)没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。

(14)将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208703.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午10:57
下一篇 2026年3月19日 上午10:58


相关推荐

  • PyCharm激活码永久有效PyCharm2020.2.3激活码教程-持续更新,一步到位[通俗易懂]

    PyCharm激活码永久有效PyCharm2020.2.3激活码教程-持续更新,一步到位[通俗易懂]PyCharm激活码永久有效2020.2.3激活码教程-Windows版永久激活-持续更新,Idea激活码2020.2.3成功激活

    2022年6月19日
    54
  • 字节离职测试专家分享[可运行源码]

    字节离职测试专家分享[可运行源码]

    2026年3月15日
    1
  • pscp linux,windows下 pscp 安装及使用

    pscp linux,windows下 pscp 安装及使用pscp 简要说明 pscp 为 window 与 Linux 之间的文件传输工具 使用和 Linux 下 scp 命令相似 pscp 安装下载 pscp 放到 C WINDOWS system32 中 然后就可以在任何地方调用 image png 远程传输到本地 pscp options user host sourcetarget 远程主机的用户名 host 远程主机的 ipsource 远程主机上的文件 只

    2026年3月17日
    2
  • mybatisplus关联表查询_hibernate多表查询

    mybatisplus关联表查询_hibernate多表查询我们在设计表的时候往往一个表的外键作为另一张表的主键,那么我们在查询的时候就要查询两个表的数据。下面来说下实现的方法。数据库表的结构wc_user实体类publicclassWcUserimplementsSerializable{ //用户idprivateStringuserId;//用户密码privateStringus…

    2025年11月14日
    3
  • python输出结果换行_python输出时如何换行

    python输出结果换行_python输出时如何换行在我们常用的 print 方法进行输出时 通常输出结果是整行显示出来的 这时候我们需要考虑一下 我们输出的结果需不需要换行 不需要换行的方法也是 soesay 的 这里就不多赘述了 来说说如何做到输出换行 常用的转义符方式 n coding utf 8 A 来看看能不能 n 换行 print A 输出结果来看看能不能换行 使用三引号进行换行 value1 value2 va

    2026年3月17日
    2
  • Java+Servlet+JSP+Mysql+Tomcat实现Web学生选课管理系统

    Java+Servlet+JSP+Mysql+Tomcat实现Web学生选课管理系统Java实现Web学生选课管理系统一、系统介绍1.软件环境2.系统功能3.数据库二、系统展示1.登录页面2.学生-主页面3.学生-查看个人信息4.学生-选择课程5.学生-查看已选课程6.教师-主页面7.教师-查看个人信息8.教师-评分9.教师-查看任课信息10.管理员-主页面11.管理员-管理员功能-查看个人信息12.管理员-管理员功能-添加新的管理员13.管理员-学生功能-添加学生14.管理员-学生功能-获取所有学生15.管理员-课程功能-添加课程16.管理员-课程功能-查询课程17.管理员-教师功能-添

    2022年10月16日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号