在 Java 语言众多的关键字中,final 关键字无疑是被提到最多的,也是在面试过程中经常被问到的知识点。今天,老王查找了很多材料,最后终于收集了关于 final 关键字比较全的知识点。首先,final 关键字可以修饰的对象有三个:一是修饰变量、二是修饰方法、三是修饰类,下面我们来看经过 final 关键字修饰的这三种对象会有着怎样的不同。

1,final 关键字修饰变量
在使用 final 关键字修饰变量时,又可以分为两种情况:一种是基本数据类型的变量、另一种是引用类型的变量。final 关键字在修饰基本数据类型时必须对变量赋予初始值,因此,final 关键字也经常和 static 关键字一起用来声明常量值,final 正好限制了必须赋值、static 声明了静态变量。

// 定义常量
final static String str = "老王说编程";

修饰引用变量时,该引用变量如果已经被赋值则不可以再被赋值,否则也会出现不能被编译的情况。

// 定义一个 Main 对象并且实例化
final Main main = new Main();
// 被 final 关键字修饰后,再次对 Main 对象进行赋值时就会出现错误
main = new Main();

2,final 关键字修饰方法
通过 final 关键字修饰的方法是不能被子类的方法重写的,相当于一个方法的功能已经被定了不能进行重写修改。一般情况下,如果一个方法的功能已经确定好不再改变了则可以使用 final 关键字修饰一下,因为 final 关键字修饰以后的方法是在程序编译的时候就被动态绑定了不用等到程序运行的时候被动态绑定,这样就大大的提高了执行的效率。

public final void method() {

    System.out.println("it is final method");
}

3,final 关键字修饰类
被 final 关键字修饰的类一般叫 final 类,final 类是不能被继承的,这也就意味着 final 类的功能一般是比较完整的。因此,Jdk 中有很多类都是用 final 关键字进行修饰的,它们不需要被继承。其中,最常见的 String 类就是 fianl 关键字修饰的类,还有其他的装饰类等等。

public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
}
public final class Integer extends Number implements Comparable<Integer> {
}
public final class Long extends Number implements Comparable<Long> {
}

以上包括其他的装饰器类都是被 final 关键字进行修饰的,它自身提供的方法和功能也是非常完备的。

4,static 关键字的不同
既然文章说明 final 关键字,难免会让人联想到 static 关键字的使用场景,毕竟,final static 成对出现的频率也是比较高的。使用 static 修饰的变量只会在类加载的时候被初始化不会因为对象的再次创建而改变。

// 在类中定义一个变量 num 接收随机数,因为只有类对象加载的时候 num 值才会初始化,
// 因此,在之后 num 的值都是不会改变的
static double num = Math.random();

更多精彩前往微信公众号【老王说编程】>>>

终于讲清楚了:深入理解Java 应用程序中 final 关键字的各种使用场景的更多相关文章

  1. 在 Java 应用程序中使用 Elasticsearch

    如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣.尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时,您就会了解 Elasticsear ...

  2. 在Java Web程序中使用监听器可以通过以下两种方法

    之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响 ...

  3. 在 Java 应用程序中加一些 Groovy 进来

    如果您一直在阅读这个系列,那么您应该已经看到有各种各样使用 Groovy 的有趣方式,Groovy 的主要优势之一就是它的生产力.Groovy 代码通常要比 Java 代码更容易编写,而且编写起来也更 ...

  4. 深入理解Java内存模型中的虚拟机栈

    深入理解Java内存模型中的虚拟机栈 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都会有各自的用途,以及创建和销毁的时间,有的区域会随着虚拟机进程的启 ...

  5. 在Java Web程序中使用Hibernate

    在Java Web程序中使用Hibernate与普通Java程序一样.本文中将使用Servlet和JSP结合Hibernate实现数据库表的增删改查操作. Web程序中,hibernate.cfg.x ...

  6. 在 Java 应用程序中绑定 Bean 和数据

    本指南介绍了 NetBeans IDE 对 Java 应用程序中 Bean 绑定和数据绑定的支持. 要学完本教程,您需要具备以下软件和资源. 软件或资源 要求的版本 NetBeans IDE 版本 7 ...

  7. Java应用程序中的声音播放

    声音可以创造意境,触发遐想,当与虚拟图像相结合时,更加可以让整个世界充满幻觉,声音是多媒体技术的基础. 播放声音是Java对多媒体的支持一个重要部分,它支持的声音文件类型主要有: AU - (扩展名为 ...

  8. 在并发Java应用程序中检测可见性错误

    了解什么是可见性错误,为什么会发生,以及如何在并发Java应用程序中查找难以捉摸的可见性错误.这些问题你可能也遇到过,当在优锐课学习了一段时间后,我对这些问题有了一定见解,写下这篇文章和大家分享. 检 ...

  9. [转载]Java应用程序中的内存泄漏及内存管理

    近期发现测试的项目中有JAVA内存泄露的现象.虽然JAVA有垃圾回收的机制,但是如果不及时释放引用就会发生内存泄露现象.在实际工作中我们使用Jprofiler调用java自带的 jmap来做检测还是很 ...

随机推荐

  1. java基础---数组的基本概念(1)

    学习资源来自尚硅谷java基础学习 1. 数组的概念 数组(Array), 是多个相同类型数据按一定顺序排列的集合, 并使用一个名字命名, 并通过编号的方式对这些数据进行统一管理. 数组属于引用数据类 ...

  2. C语言:转义字符 ++a例子

    #include <stdio.h> int main() { printf("a\bwhat\'s\tyour\tname\n"); int k; printf(&q ...

  3. [刘阳Java]_Web前端入门级练习_迅雷首页第一屏设计

    今天接着上一篇文章<Web前端入门级练习_迅雷官宣网设计>正式开始迅雷首页第一版的设计.如果完成,则最终的效果图如下 第一步:先完成logo部分的设计 logo设计,我们会使用CSS的定位 ...

  4. [刘阳Java]_处理并发有哪些方法

    1.HTML静态化 ,将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素2.禁止重复提交:用户提交之后按钮置灰,禁止重复提交3.用户限流:在某一时间段内只允许用户提交一次请求,比如可以采取 ...

  5. 基于IDEA的JAVA开发[第一集]:在Linux上安装IDEA

    1,因为买了荣耀的magicbook pro 锐龙版,系统是Linux,以后打算直接在Linux上开发.本来熟悉Myeclipse,下载了Myeclipse2017 for Linux,但是安装中出现 ...

  6. 40.qt quick- 高仿微信实现局域网聊天V4版本(支持gif动图表情包、消息聊天、拖动缩放窗口)

    在上章37.qt quick- 高仿微信实现局域网聊天V3版本(添加登录界面.UDP校验登录.皮肤更换.3D旋转),我们已经实现了: 添加登录界面. UDP校验登录. 皮肤更换. 3D旋转(主界面和登 ...

  7. php使用curl模拟post请求

    废话不多说,直接上代码,做个笔记. $url="http://localhost/header_server.php"; $body = array("mobile&qu ...

  8. Windows Server创建域控制器

    推荐选择系统镜像为windows server2016(2019有诡异的bug不能安装域控.) 1.本地域安装设置 (1)连接到windows server2016 打开服务器管理器(Server M ...

  9. django2.1实现全文检索(最详细)+遇到的坑+jieba分词

    首先django实现全文检索在这里使用的是haystack,环境是django2.1+win10 64+py3.7 1: 安装包: pip install dgango-haystack #安装全局检 ...

  10. jvm源码解读--01 jvm加载java/lang/object过程

    现在做一下记录,这个看了两天,看的过程发现了很多c++的高级特性,没接触过,还得慢慢撸,禁止很慢 那么现在开始 吧 先打两个断点 java.c:351 JavaMain(void * _args) { ...