Java中final关键字的几种用法

在java的关键字中,staticfinal是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。下面我们来了解一下final关键字及其用法。

final关键字

在java中,final的含义在不同的场景下有细微的差别,但总体上来说,它指的是“这是不可变的”。下面,我们来讲final的四种主要用法。

1.修饰数据

在编写程序时,我们经常需要说明一个数据是不可变的,我们成为常量。在java中,用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以改变它的值。更重要的是,final会告诉编译器,这个数据是不会修改的,那么编译器就可能会在编译时期就对该数据进行替换甚至执行计算,这样可以对我们的程序起到一点优化。不过在针对基本类型和引用类型时,final关键字的效果存在细微差别。我们来看下面的例子:

复制代码
 1 class Value {2     int v;3     public Value(int v) {4         this.v = v;5     }6 }7 8 public class FinalTest {9     
10     final int f1 = 1;
11     final int f2;
12     public FinalTest() {
13         f2 = 2;
14     }
15 
16     public static void main(String[] args) {
17         final int value1 = 1;
18         // value1 = 4;
19         final double value2;
20         value2 = 2.0;
21         final Value value3 = new Value(1);
22         value3.v = 4;
23     }
24 }
复制代码

上面的例子中,我们先来看一下main方法中的几个final修饰的数据,在给value1赋初始值之后,我们无法再对value1的值进行修改,final关键字起到了常量的作用。从value2我们可以看到,final修饰的变量可以不在声明时赋值,即可以先声明,后赋值。value3时一个引用变量,这里我们可以看到final修饰引用变量时,只是限定了引用变量的引用不可改变,即不能将value3再次引用另一个Value对象,但是引用的对象的值是可以改变的,从内存模型中我们看的更加清晰:

上图中,final修饰的值用粗线条的边框表示它的值是不可改变的,我们知道引用变量的值实际上是它所引用的对象的地址,也就是说该地址的值是不可改变的,从而说明了为什么引用变量不可以改变引用对象。而实际引用的对象实际上是不受final关键字的影响的,所以它的值是可以改变的。

另一方面,我们看到了用final修饰成员变量时的细微差别,因为final修饰的数据的值是不可改变的,所以我们必须确保在使用前就已经对成员变量赋值了。因此对于final修饰的成员变量,我们有且只有两个地方可以给它赋值,一个是声明该成员时赋值,另一个是在构造方法中赋值,在这两个地方我们必须给它们赋初始值。

最后我们需要注意的一点是,同时使用static和final修饰的成员在内存中只占据一段不能改变的存储空间。

2.修饰方法参数

前面我们可以看到,如果变量是我们自己创建的,那么使用final修饰表示我们只会给它赋值一次且不会改变变量的值。那么如果变量是作为参数传入的,我们怎么保证它的值不会改变呢?这就用到了final的第二种用法,即在我们编写方法时,可以在参数前面添加final关键字,它表示在整个方法中,我们不会(实际上是不能)改变参数的值:

复制代码
public class FinalTest {
</span><span style="color: #008000;">/*</span><span style="color: #008000;"> ... </span><span style="color: #008000;">*/</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> finalFunc(<span style="color: #0000ff;">final</span> <span style="color: #0000ff;">int</span> i, <span style="color: #0000ff;">final</span><span style="color: #000000;"> Value value) {</span><span style="color: #008000;">//</span><span style="color: #008000;"> i = 5; 不能改变i的值</span><span style="color: #008000;">//</span><span style="color: #008000;"> v = new Value(); 不能改变v的值</span>value.v = 5; <span style="color: #008000;">//</span><span style="color: #008000;"> 可以改变引用对象的值</span>

}
}

复制代码

3.修饰方法

第三种方式,即用final关键字修饰方法,它表示该方法不能被覆盖。这种使用方式主要是从设计的角度考虑,即明确告诉其他可能会继承该类的程序员,不希望他们去覆盖这个方法。这种方式我们很容易理解,然而,关于private和final关键字还有一点联系,这就是类中所有的private方法都隐式地指定为是final的,由于无法在类外使用private方法,所以也就无法覆盖它。

4.修饰类

了解了final关键字的其他用法,我们很容易可以想到使用final关键字修饰类的作用,那就是用final修饰的类是无法被继承的。

上面我们讲解了final的四种用法,然而,对于第三种和第四种用法,我们却甚少使用。这不是没有道理的,从final的设计来讲,这两种用法甚至可以说是鸡肋,因为对于开发人员来讲,如果我们写的类被继承的越多,就说明我们写的类越有价值,越成功。即使是从设计的角度来讲,也没有必要将一个类设计为不可继承的。Java标准库就是一个很好的反例,特别是Java 1.0/1.1中Vector类被如此广泛的运用,如果所有的方法均未被指定为final的话,它可能会更加有用。如此有用的类,我们很容易想到去继承和重写他们,然而,由于final的作用,导致我们对Vector类的扩展受到了一些阻碍,导致了Vector并没有完全发挥它应有的全部价值。

总结

final关键字是我们经常使用的关键字之一,它的用法有很多,但是并不是每一种用法都值得我们去广泛使用。它的主要用法有以下四种:

  1. 用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值;
  2. 用来修饰方法参数,表示在变量的生存期中它的值不能被改变;
  3. 修饰方法,表示该方法无法被重写;
  4. 修饰类,表示该类无法被继承。

上面的四种方法中,第三种和第四种方法需要谨慎使用,因为在大多数情况下,如果是仅仅为了一点设计上的考虑,我们并不需要使用final来修饰方法和类。

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

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

相关文章

python pyqt5安装_Python3 安装PyQt5及exe打包图文教程

环境: Python 3.6.4 Pycharm Professional 2017.3.3 PyQt5 PyQt5-tools① Python 3 安装Python 3.x 安装时&#xff0c;默认勾选ADD Python 3.6 to PATH和ADD Python to environment variables的情况下&#xff0c;系统会向path中增加以下两个环境变量。D:\Program Files\Py…

《企业软件交付:敏捷与高效管理精要》——3.4 企业软件交付的软件工厂方法...

3.4 企业软件交付的软件工厂方法 正如我们前面讨论的&#xff0c;今天的机构面对的商业环境正以前所未有的速度发生变化。与此同时&#xff0c;这些机构还要管理和降低整个机构的运营成本。这就直接意味着&#xff0c;他们不仅要最大限度地减少浪费和低效率&#xff0c;还要提…

201706问题记录

1.四周阴影 box-shadow:0px 0px 10px #f5f5f5; 2. 原生setattribute()方法 jquery的attr()$(.fd-sq-zk).attr("title","收起"); 3.在iframe中获取外层容器的元素 属性等 $(parent.document).find("html")..... 4.监听页面变大变小事件 /…

一致性hash算法_(图文案例)一致性哈希算法详解 一点课堂(多岸教育)

一致性Hash算法关于一致性Hash算法&#xff0c;在我之前的博文中已经有多次提到了&#xff0c;MemCache超详细解读一文中”一致性Hash算法”部分&#xff0c;对于为什么要使用一致性Hash算法、一致性Hash算法的算法原理做了详细的解读。算法的具体原理这里再次贴上&#xff1a;…

《HTML5 Canvas游戏开发实战》——2.1 绘制基本图形

本节书摘来自华章计算机《HTML5 Canvas游戏开发实战》一书中的第2章&#xff0c;第2.1节,作者&#xff1a;张路斌著&#xff0c; 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 2.1 绘制基本图形 所谓基本图形&#xff0c;就是指线、矩形、圆等最简单的图形&#x…

如何查看Ubuntu版本

有时候需要查看一下系统安装的Ubuntu的版本&#xff0c;最简单的方式是输入lsb_release -a。whatis lsb_release输出&#xff1a;print distribution-specific information。所以lsb_release这个命令就是用来输出发行版的信息的。 Open the Terminal enter:lsb_release -a It w…

linux下.a/.so/.la目标库区别

在linux平台上编译时&#xff0c;常会遇到目标库的疑问&#xff0c;有静态库也有动态库&#xff0c;单个理解都不太难&#xff0c;但是对复杂的工程而言&#xff0c;一旦混合到一起去&#xff0c;对整个工程的理解和调用&#xff0c;将会造成很大困扰&#xff0c;本文就汇总这几…

python 二元函数绘制_Python绘制二元函数曲面

微实践&#xff1a;绘制二元函数曲面我们将演示如何借助于ufunc的广播运算计算下述二元函数的在一个xy平面上的值并将其绘制成3D曲面。其中&#xff0c;x和y的取值范围均为[-2,2]。为了达到目的&#xff0c;我们需要一个二维的结果数组z&#xff0c;其元素的下标对应参数x,y的取…

Npgsql使用入门(三)【批量导入数据】

Program.cs代码: class Program{static void Main(string[] args){var test new PgBulkCopyHelper<SingleBuilding>("bld_amap_gzmain");foreach (string pName in test.PropNames){Console.WriteLine("name: {0},\t\ttype: {1}", pName, test.Prop…

远程网络视频监视技术

目前要实现广域网视频监视&#xff0c;主要通过三种方式实现&#xff1a;1.硬盘录像机&#xff1b;2.网络视频服务器&#xff1b;3.网络摄像机。 硬盘录像机是一个以录像为主的设备&#xff0c;有的可以支持IE浏览。网络视频服务器一般前端不录像&#xff0c;直接将影像传输到…

Deepin下java开发环境部署

简介 本经验由深度论坛用户(zhang12345shun)分享&#xff0c;原文地址 正文 SUN JDK&#xff08;现已改名Oracle JDK&#xff09; 1.下载Sun版JDK压缩包&#xff08;.tar.gz&#xff09;&#xff0c;选择其中的32/64位Linux版本。 2.将其解压缩&#xff1a; sudo tar -zx…

判断ic卡类型

传15读卡片数据 判断data8的status是否为0&#xff0c;是则是ic 否则就是磁条卡 根据二磁道数据识别是IC卡还是磁条卡 根据二磁道符号后面第一位识别。规则是 该数字 6 或者 2 则该卡是IC卡&#xff0c;否则是普通磁条卡 转载于:https://www.cnblogs.com/wubenhui/p/6956256.h…

python常用代码_Python常用算法学习(3)(原理+代码)——最全总结

1&#xff0c;什么是算法的时间和空间复杂度算法(Algorithm)是指用来操作数据&#xff0c;解决程序问题的一组方法&#xff0c;对于同一个问题&#xff0c;使用不同的算法&#xff0c;也许最终得到的结果是一样的&#xff0c;但是在过程中消耗的资源和时间却会有很大的区别。那…

数据监测驱动下的信息流广告优化

信息流广告是什么 “今日头条和百度必有一战”&#xff0c;相信不少的互联网人在过去几个月都听到过类似的断言。定位于信息分发平台的今日头条和主营搜索业务的百度会产生如此大的利益冲突&#xff0c;最核心的点其实就是信息流广告。 信息流广告指的是在用户使用互联网产品或…

在idea中使用git管理你的项目

起步 idea是十分智能的Java集成开发环境 而我们在用idea写项目的时候经常遇到版本控制的问题,而git工具如果你只会在终端中的git命令来进行控制,可能会使得效率低下 今天小编就教大家在idea中使用git来管理你的项目 首先创建一个项目 点击create new projects 这里选择默认…

react-native热更新插件react-native-code-push

使用react-native-code-push插件来实现热更新的时候&#xff0c;会遇到一些问题。下面这个问题就让我差点崩溃了。 在测试 Production 和 Staging 是否会去检查各自环境下的bundle文件&#xff0c;我就遇到了混乱的问题。 有时候用 Release 打包出来的app会去检查 Staging 下的…

《工业控制网络安全技术与实践》一一第3章 工业控制网络安全威胁

第3章 工业控制网络安全威胁 第2章介绍了工业控制系统的相关知识。本章主要介绍工业控制网络的基本知识&#xff0c;并详细介绍工业控制网络的常见安全威胁。之后&#xff0c;分析工业控制系统的脆弱性。

多媒体视频知识入门贴zt(二)

2.2 音视频基本概念介绍 2.2.1 视频的基本概念 RGB和YUV RGB指的是红绿蓝&#xff0c;应用还是很广泛的&#xff0c;比如显示器显示&#xff0c;BMP文件格式中的像素值等&#xff1b;而YUV主要指亮度和两个色差信号&#xff0c;被称为luminance和chrominance他们的转化关系可以…

Java笔记01-数组相关

数组相关 数组的创建 数据类型[] 数组名称 new 数据类型[数组的长度]其中数据类型可以为任意类型 数组的访问 • 调用数组的length属性可以获取数组的长度&#xff1a; int len arr.length;• 可以通过下标的方式访问数组中的每一个元素。 需要注意的是&#xff1a;数组…

偏好设置

转载于:https://www.cnblogs.com/xufengyuan/p/6959424.html