final的分析

2023-10-27

源自:http://www.cnblogs.com/dolphin0520/p/3736238.html 

1.修饰类

  当用final修饰一个类时,表明这个类不能被继承

 2.修饰方法

 “使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“

 如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。

 3.修饰变量

对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

=============================

重点分析:

1.类的final变量和普通变量有什么区别?

  当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。

  那么final变量和普通变量到底有何区别呢?下面请看一个例子:

1
2
3
4
5
6
7
8
9
10
11
public  class  Test {
     public  static  void  main(String[] args)  {
         String a =  "hello2"
         final  String b =  "hello" ;
         String d =  "hello" ;
         String c = b +  2
         String e = d +  2 ;
         System.out.println((a == c));
         System.out.println((a == e));
     }
}

  

true
false

  大家可以先想一下这道题的输出结果。为什么第一个比较结果为true,而第二个比较结果为fasle。这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。这种和C语言中的宏替换有点像。因此在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b 替换为它的  值。而对于变量d的访问却需要在运行时通过链接来进行。想必其中的区别大家应该明白了,不过要注意,只有在编译期间能确切知道final变量值的情况下,编译器才会进行这样的优化,比如下面的这段代码就不会进行优化:

1
2
3
4
5
6
7
8
9
10
11
12
13
public  class  Test {
     public  static  void  main(String[] args)  {
         String a =  "hello2"
         final  String b = getHello();
         String c = b +  2
         System.out.println((a == c));
 
     }
     
     public  static  String getHello() {
         return  "hello" ;
     }
}

  这段代码的输出结果为false。

2.被final修饰的引用变量指向的对象内容可变吗?

  在上面提到被final修饰的引用变量一旦初始化赋值之后就不能再指向其他的对象,那么该引用变量指向的对象的内容可变吗?看下面这个例子:

1
2
3
4
5
6
7
8
9
10
11
public  class  Test {
     public  static  void  main(String[] args)  {
         final  MyClass myClass =  new  MyClass();
         System.out.println(++myClass.i);
 
     }
}
 
class  MyClass {
     public  int  i =  0 ;
}

  这段代码可以顺利编译通过并且有输出结果,输出结果为1。这说明引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。

3.final和static

  很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变。看下面这个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public  class  Test {
     public  static  void  main(String[] args)  {
         MyClass myClass1 =  new  MyClass();
         MyClass myClass2 =  new  MyClass();
         System.out.println(myClass1.i);
         System.out.println(myClass1.j);
         System.out.println(myClass2.i);
         System.out.println(myClass2.j);
 
     }
}
 
class  MyClass {
     public  final  double  i = Math.random();
     public  static  double  j = Math.random();
}

  运行这段代码就会发现,每次打印的两个j值都是一样的,而i的值却是不同的。从这里就可以知道final和static变量的区别了。

4.匿名内部类中使用的外部局部变量为什么只能是final变量?

点击打开链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

final的分析 的相关文章

  • 机考[41-50]

    华为机考 041 求解连续数列 042 求字符串中所有整数的最小和 043 求最多可以派出多少支团队 044 删除字符串中字符最少字符 045 数据分类 046 数列描述 047 数字涂色 048 数组二叉树 049 数组拼接 050 数组
  • MD5 加密算法详细介绍

    MD5是什么 message digest algorithm 5 信息 摘要算法 经常说的 MD5加密 就是它 信息 摘要算法 在下载一下东西时 经常在一些压缩包属性里 看到md5值 而且这个下载页面 很可能会在某一个地方 写了一句 此文
  • 同时存在js和jq时的相互定义转换

    div div div div
  • keras序列化模型 to json文件,保存模型和加载模型

    首先保存 1 模型结构 2 模型参数数据 usr bin env python coding utf 8 Author Jia ShiLin 模型的权重保存在HDF5中 模型的结构保存在JSON文件或者YAML文件中 Keras提供了to
  • Dbus数据总线(基于0.5.0) 深入理解,源码适配修改编译全过程,集群部署,使用操作

    声明 本文基于2018年10月份 发版的0 5版本进行安装实验 dbus产生背景 首先了解下当下的采集工具 1 我们发现 采集工具都有各自的优点和应用场景 但是都缺乏统一的数据源端管控 所以无法找到统一的数据入口 2 各个数据使用方在业务低
  • .ajax判断参数,vue.js获取ajax参数

    vue js获取ajax参数 内容精选 换一换 获取标签所有技术栈您可以在API Explorer中调试该接口 GET v2 stacks状态码 200状态码 403状态码 404状态码 406状态码 500获取标签所有技术栈状态码 200
  • 基于ARM Cortex-M0+内核的bootloader程序升级原理及代码解析

    本文主要讲述BootLoader程序升级原理及一些代码的解析 力图用通俗易懂的语言描述清楚BootLoader升级的主要关键点 BootLoader 升级原理概述 首次接触这一块时 有一个概念叫IAP 在应用编程 通俗一点讲便是通过一段已有
  • Latex公式自动编号与自动引用

    在进行latex引用时 有两种办法 一 被动引用 如有这样一段代码 x 2 y 2 z 2 eqno 1 1 In this paper we investigated 1 1 and applied it into some fields
  • 图论(四)宽度优先搜索BFS

    宽度优先搜索 BFS Breadth First Search 是一个针对图和树的遍历算法 发明于上世纪50年代末60年代初 最初用于解决迷宫最短路径和网络路由等问题 对于下面的树而言 BFS方法首先从根节点1开始 其搜索节点顺序是1 2
  • keepalived-lvs-nat-主备模型实现高可用负载均衡

    keepalived简介 Keepalived的作用是检测web服务器的状态 如果有一台web服务器死机 或工作出现故障 Keepalived将检测到 并将有故障的web服务器从系统中剔除 当web服务器工作正常后Keepalived自动将
  • 移远公司 NB-IoT模块AT指令详细解释

    AT指令的分类和格式 AT指令分测试指令 读取参数指令 设置参数指令 执行命令指令四类 参见下表 命令 命令名称 命令功能 AT lt CMD gt 测试命令 询问模块支持哪些设置参数或者是那些项目 AT lt CMD gt 读取命令 读取
  • 2.数据定义语言DDL

    一 数据库定义语言 DDL Data Definition Language 是用于描述数据库中要存储的现实世界实体的语言 主要由create 添加 alter 修改 drop 删除 和 truncate 删除 四个关键字完成 二 crea
  • 服务器的软件架构

    1 服务器的整体架构 x86 2 服务器的软件整体架构 x86 3 服务器的软件介绍BIOS POST CPU 内存 外设初始化与资源分配 BIOS Setup 英文 中文 CPU Performance SATA等接口控制 BIOS BM

随机推荐

  • JS Date日期的使用

    Date 分两大系列 1 get系列 及获取时间 2 set系列 及设置时间 1 get系列的方法 1 getDate 返回一月中的某一天 2 getDay 返回一周中的某一天 0 6 0代表周日 6代表周一 3 getFullyear 返
  • 架构师分享 7 种软件设计架构 (文末送书)

    文末留言送书5本 架构模式是对给定上下文的软件架构中常见问题的一种通用的可复用的解决方案 一种模式就是特定上下文的问题的一种解决方案 然而 很多开发者至今还对各种软件架构模式之间的差别搞不清 甚至对其所知甚少 大体上 主要有下面这7种架构模
  • Haskell学习——语法

    if then else Haskell是以表达式为主导的语言 expression oriented 所有语句必须要能给出一个具体的值 比如我们喜闻乐见的if else结构 Prelude gt if True then 1
  • 《数值分析》-- 高斯求积公式

    文章目录 概述 一 高斯型求积公式的一般理论 1 1 高斯型求积公式和高斯点 1 2 高斯点的特征 二 常用的高斯求积公式 2 1 高斯 勒让德求积公式 Gauss Legendre 2 2 高斯 切比雪夫求积公式 Gauss Chebys
  • 让生产力加倍的ChatGPT快捷指令

    我的新书 Android App开发入门与实战 已于2020年8月由人民邮电出版社出版 欢迎购买 点击进入详情 Why use ChatGPT Shortcut 简化流程 ChatGPT Shortcut 提供了快捷指令表 可以快速筛选和搜
  • OpenGL视频资料(LearnOpenGL中文)经典教材讲解

    OpenGL视频资料 LearnOpenGL中文 经典教材讲解 1 是中文 台湾的傅老师 讲的非常好 而且还是免费的 感谢傅老师的分享 视频地址 2 视频目录 讲解的非常仔细 可以说是手把手教 而且是openGL经典入门教材LearnOpe
  • [Python] Python基础入门笔记

    本篇是B站Python基础视频 有C Java编程基础容易理解 120分钟入门Python的学习笔记 Python基础笔记 一 Python 简介 1 Python执行过程 2 执行模式 二 语法规则 三 函数 1 内置函数 range 2
  • java基础练习—逢七游戏、不死神兔、百钱百鸡、利滚利

    1 逢七游戏 逢七过 规则是 从任意一个数字开始报数 当你要报的数字包含7或者是7 的倍数时都要说 过 为了帮助大家更好的玩这个游戏 这里我们直接在控制台打印出1 100之间的满足逢七必过 规则的数据 package com bdit pu
  • ThinkCentre进入BIOS,设置intel virtualization technology

    VMware安装提示cpu虚拟化intel virtualization technology ThinkCentre重启长按F1 按enter 开启intel virtualization technology F10保存即可 转载于 h
  • git团队开发使用流程概述和注意点

    重新温习了一下git 这篇文章主要总结一下使用git做开发的整体流程 所以不会做过多的git指令的详细说明 整体流程 这里我在本地进行模拟 我希望模拟达到的效果是 一共有4个端 project是一个仓库 manager是项目负责人 zs和l
  • 【面试】Java 必知必会

    必知必会 1 面向对象可以解释下么 都有哪些特性 关于封装 关于继承 重写 Override 关于多态 重载 如果只有方法返回值不同 可以构成重载吗 在 Java 中 什么时候使用重载 什么时候使用重写 子类对象作为父类对象使用 向上转型
  • 【Antlr】识别常见的词法结构

    1 概述 语法分析器通过输入的词法符号流来识别特定的语言结构 词法分析器通过输入的字符流来识别特定的语言结构 词法规则以大写字母开头 文法规则以小写字母开头 例如 ID是一个词法规则名 而expr是一 个文法规则名 2 配置标识符 在语法的
  • 数据结构—顺序表的初始化与销毁(C语言详细解读版1/3)

    顺序表 顺序表 SqList Sequence List 即顺序线性表 顺序表是在计算机内存中以数组的形式保存的线性表 是指用一组地址连续的存储单元依次存储数据元素的线性结构 使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中
  • 自动售卖系统开发系列——人脸识别自动售卖机三代BrotherSharp

    大纲 售卖机三代BrotherSharp的简介 售卖机三代BrotherSharp的方案介绍 系统整体组成 软件平台 硬件平台 售卖机三代BrotherSharp的实现过程 功能实现论述 软件流程图 源码 售卖机三代BrotherSharp
  • ArcGIS Desktop 遇到严重的应用程序错误

    由于项目初验 忙了几个月 感觉忙得并不值 好久都没更新博客了 一 问题 在关闭ArcMap时 ArcGIS Desktop 遇到严重的应用程序错误 环境是Windows 10 新装的系统 以前出现这种问题 一般有两种情况 一是ArcGIS
  • Pycharm调试debug指导

    PyCharm的调试有两种显示模式 Debugger和Console Debugger处以列表形式 列出每个元素的内容 Console处与直接Run输出类似 Debugger模式 Step Over Step Into 区别 调试方式 快捷
  • FutureTask详解

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 FutureTask介绍 一个可取消的异步计算 FutureTask提供了对Future的基本实现 可以调用方法去开始和取消一个计算 可以查询
  • Line-in和Mic-in的区别和使用及Line-out

    Line in和Mic in的区别 http blog 163 com why ann 2001 blog static 331376200821391621467 我们的电脑声卡上 一般都会有Line in和Mic in两个接口 翻译成中
  • 【SAML2.0】概念盲扫

    目录 一 SAML是什么 二 SAML 1 SAML的构成 2 SAML的流程分析 3 SAML的优点 简介 安全断言标记语言 英语 Security
  • final的分析

    源自 http www cnblogs com dolphin0520 p 3736238 html 1 修饰类 当用final修饰一个类时 表明这个类不能被继承 2 修饰方法 使用final方法的原因有两个 第一个原因是把方法锁定 以防任