`

Java-Final

    博客分类:
  • JDK
阅读更多
今天有人问我,Java的对象或者类型修改用Final.
Java中的final关键字通常的指的是“这是无法改变的”。它可能被做为三种的修饰词.------数据,方法,类。
一 final数据
1.在修饰基本类型时,表示它是一个常量,在定义时必须给予赋值.
   特别的一个既是static又是final 的字段只占据一段不能改变的存储空间。
2.在修饰对象或者数组时,它表示对对象或数组的引用恒定不变,然而对象本身却是可以修改的.
  空白final:声明为final但末给定初值的字段,但必须确保空白final在使用前被初始化,一般在构造方法完成。
  final参数:在方法的参数列表以声明的方式将参数指明为final,这意味着在方法里无法修改参数的引用所指向的对象。
二 final方法
1. 把方法锁定,使得在子类(导出类)中不能修改它的含义。
2.效率,一个final方法被调用时会转为内嵌调用,不会使用常规的压栈方式,使得运行效率较高,尤其是在方法体较简单的情况下,
   但也并不绝对。(与C++中的inline关键字类似)
特别的:类中的所有private方法都隐式地指定为是final,所以在继承关系中不存在覆盖问题。
三 final类
声明为final的类不能派生出了子类,也就是不能被继承,一个final类中的所有方法都隐式地指定为final.

可能有人会问了,你说不能改变,你说只占据一段存储空间,你懂JVM的编译规则吗?
首先举下Final数据的例子.
public class MyClass {
        private static final int aa=1;
        int b=3;
        
        public int add(int a,int b){
                return a+b;
        }
} 

Javac MyClass
public class com.tag2.jvm.MyClass {
  
  // Field descriptor #6 I
  private static final int aa = 1;
  
  // Field descriptor #6 I
  int b;
  
  // Method descriptor #11 ()V
  // Stack: 2, Locals: 1
  public MyClass();
     0  aload_0 [this]                                                                    //0:变量到操作数栈
     1  invokespecial java.lang.Object() [13]                               //1:调用需要特殊处理的实例方法:invokespecial
     4  aload_0 [this]                                                                    //4:变量到操作数栈
     5  iconst_3                                                                             //5:常数到操作数栈
     6  putfield com.tag2.jvm.MyClass.b : int [15]                       //6:访问类的域和类实例域,com.tag2.jvm.MyClass.a : int [15]  
     9  return
      Line numbers:
        [pc: 0, line: 3]
        [pc: 4, line: 5]
        [pc: 9, line: 3]
      Local variable table:
        [pc: 0, pc: 10] local: this index: 0 type: com.tag2.jvm.MyClass
    ...
}

大家看以上的编程Class文件,通过JVM指令解析,一般操作步骤是,先声名变量 int aa,int b.然后再把常数也压到栈中,最后赋值的过程。
大家看到final修改的变量不需要赋值[一个既是static又是final 的字段只占据一段不能改变的存储空间]
(声名为静态的是类变量,其访问速度会快(少了一个赋值过程),也就是固定的内存地址,用final修改就是不可改变的存储空间)
用final修改意为不可改为,这意味着在方法里无法修改参数的引用所指向的对象。[引用恒定不变 ,对象本身可以修改]
我上节介绍了设计模式之单例模式,其中Spring用到了两个synchronized (this.startupShutdownMonitor) synchronized (this.singletonObjects)
其中两个对象都是final类型的[Spring的锁对象一般都是Final的,不可改变的,也就保证了其原子性]。



分享到:

相关推荐

    poi-2.0-final和poi-3.2-final

    - "poi-2.0-final.jar" 和 "poi-3.2-final.jar":这些是Apache POI库对应的JAR文件,包含了所有必要的类和资源,可以直接在Java项目中引用,以便利用POI的功能。 **压缩包子文件的文件名称列表**: 虽然没有具体的...

    Java-Final-Project:Java类的最终项目

    "Java-Final-Project:Java类的最终项目"这个项目可能是一个综合性的学习或实践项目,旨在让学生或者开发者掌握Java类的设计和应用。 在Java中,类是面向对象编程的基础,它是对象的模板,定义了对象的状态(数据...

    Java-Final-Project

    【Java-Final-Project】是一个基于Java编程语言的最终项目,通常在学习Java课程或进行软件开发实践时作为总结性的任务。这个项目可能是为了检验学生对Java编程的全面理解和应用能力,包括面向对象编程、数据结构、...

    java-final-check:一个测试项目,显示如何在Java中覆盖final类的方法

    在这个名为"java-final-check"的测试项目中,开发者旨在展示如何在Java中尝试覆盖final类的方法,尽管这在标准的Java语法中是不允许的。以下是对这个项目和Java final特性的详细解释。 1. **final类**: 当一个类被...

    PDFBookmark-1.0.2-final.rar

    3. **跨平台兼容性**:由于基于Java,PDFBookmark-1.0.2-final可以轻松在不同操作系统上运行,无需为每种系统单独编写版本。只需确保系统安装了JRE,即可在Windows、Linux或Unix上运行此工具。 4. **书签管理**:...

    Aptech-Java-final-project:做一个aptech sem2

    【标题】"Aptech-Java-final-project"指的是一个基于Java技术的Aptech教育机构学期二(sem2)的最终项目。这个项目可能是为了帮助学生巩固他们在Java编程语言中学到的知识,通过实际操作来提升技能。Aptech是全球...

    Java Persistence API 2.0-final-spec

    Java持久化API(Java Persistence API,简称JPA)是Java平台上的一个标准,用于管理和持久化应用...下载《Java Persistence API 2.0-final-spec.pdf》文档,可以深入了解JPA 2.0的完整规范,为实际开发提供详尽的指导。

    Java-Final-Project:适用于Java类的数独求解器

    在这个“Java-Final-Project”中,我们关注的是一个特定的应用:一个基于Java的数独求解器。数独是一种逻辑游戏,玩家需要通过填数字填充一个9x9的网格,使得每一行、每一列以及每个3x3的小宫格(也称为子区域)内的...

    persistence-2_0-final-jar_and_schema.zip

    《深入理解JPA:基于persistence-2_0-final-jar_and_schema.zip的解析》 在Java开发领域,Java Persistence API(JPA)是用于管理关系数据库中的对象持久化的一个重要标准。它为开发者提供了一种简洁、面向对象的...

    java-final-maven-javafx:东北大学,信息系统科学硕士Java最终项目,2020年Spring

    该项目是东北大学(NEU)信息系统科学硕士课程2020年春季学期的Java最终项目,命名为"java-final-maven-javafx"。这个项目基于Java编程语言,使用Maven作为构建工具,并集成JavaFX库来创建图形用户界面。下面我们将...

    poi-bin-3.1-FINAL-20080629

    标题“poi-bin-3.1-FINAL-20080629”指的是Apache POI项目的二进制发行版,版本为3.1-FINAL,发布日期为2008年6月29日。Apache POI是一个流行的开源Java库,它允许开发人员创建、修改和读取Microsoft Office格式的...

    tuling-juc-final.zip

    本项目"tuling-juc-final.zip"显然聚焦于Java并发编程的实践,通过一系列代码示例来演示和解释Java内存模型(JMM)、`synchronized`关键字以及`volatile`关键字的使用。下面我们将深入探讨这些核心概念。 Java内存...

    poi-3.10-FINAL.jar 解析excel用

    Apache POI是一个强大的开源库,它为Java开发者提供了读取和写入Microsoft Office格式文件的能力,尤其是Excel(.xlsx和.xls)文件。本文将深入探讨如何使用Apache POI 3.10-FINAL版本来解析Excel文件。 Apache POI...

    spring3.2+ Hibernate 3.5.4-Final+struts2 整合开发jar包

    标题中的"spring3.2+ Hibernate 3.5.4-Final+struts2 整合开发jar包"指的是一个软件开发项目中采用的技术栈,它涵盖了Spring框架的3.2版本、Hibernate ORM框架的3.5.4-Final版本以及Struts2 Web应用框架的2.3.20版本...

    final-final--final.rar_网络聊天

    "final-final--final.rar_网络聊天"可能是一个包含了用于构建网络聊天应用的相关资源和代码的压缩包。在这个压缩包里,我们有两个文件:www.pudn.com.txt 和 final-final--final。下面将详细探讨网络聊天系统的基础...

    hibernate-distribution-3.5.0-Final-dist文档

    **hibernate-distribution-3.5.0-Final-dist文档概述** Hibernate 是一个流行的开源对象关系映射(ORM)框架,它允许Java开发者在Java应用程序中操作数据库,而无需直接编写SQL语句。在Hibernate 3.5.0-Final版本中...

    poi-3.10-FINAL.jar

    "poi-3.10-FINAL.jar"是Apache POI项目的特定版本,即3.10最终版,它包含了所有你需要在Java环境中读取、创建和修改这些文件所需的功能。 Apache POI的核心概念是HWPF(Horrible Word Processor Format)用于处理...

    java解压rar 包含java-unrar-0.3.jar

    在Java编程环境中,有时我们需要处理RAR文件,例如读取、提取或查看RAR文件内容。`java-unrar-0.3.jar`是一个库,它允许Java开发者处理RAR文件,无需依赖外部命令行工具,如WinRAR。这个库为Java提供了一个简单易用...

    servlet-3_1-final(中文版).doc

    《Java Servlet 3.1 规范》是中国Java开发者学习Servlet技术的重要参考资料,它详细阐述了Servlet 3.1版本中的...通过阅读和实践《servlet-3_1-final(中文版).doc》,开发者可以更好地掌握Java Web开发的核心技术。

    poi-ooxml-3.10-FINAL.JAR

    这个是使用java导出Excel表格必备的jar包,后续会上传一片文章是关于这一块的

Global site tag (gtag.js) - Google Analytics