`
你是救世主
  • 浏览: 121180 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 中的 final 变量

阅读更多

 

【java中为什么会有final变量】:

    final这个关键字的含义是“这是无法改变的”或者“终态的”;

    那么为什么要阻止改变呢?

    java语言的发明者可能由于两个目的而阻止改变:

    1).效率问题:

        jdk中的某些类的某些方法,是不允许被用户覆盖的,设计者可能认为,所用方法已经是最好的方法,

        用户私自覆盖,或是由于疏忽而覆盖,就会影响JVM或是系统的系能;

    2). 设计所需:

        众所周知,有些情况必须使用final关键字,比如方法中的匿名内部类的参数传递;

 

【final关键字的使用方法】:

    【修饰变量】:

        final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

    【修饰方法】:

        final方法不能被子类方法覆盖,但可以被继承。

    【修饰类】:

        final类不能被继承,没有子类,final类中所有方法都是final的。

 

【final的内存分配方式】:

    【修饰变量】:

        通常情况下,final变量有3个地方可以赋值:直接赋值,构造函数中,或是初始化块中。

        【初始化】:

            由于在java的语法中,声明和初始化是联系在一起的,

            也就是说:如果你不显示的初始化一个变量,系统会自动用一个默认值来对其进行初始化。(如int就是0)

            对于final变量,在声明时,如果你没有赋值,系统默认这是一个空白域,在构造函数进行初始化,

            如果是静态的,则可以在初始化块。

        【内存】:

             常量(final变量)和非final变量的处理方式是不一样的。

             每一个类型在用到一个常量时,都会复制一份到自己的常量池中。

             常量也像类变量(static)一样保存在方法区,只不过他保存在常量池。

             (可能是,类变量被所有实例共享,而常量池是每个实例独有的。)

    【修饰方法】:

        保存在方法区,并且可以被函数代码直接替换,而不用等到执行时再决定具体是那个函数。

    【修饰类】:

        保存在方法区。

 

【java中变量的初始化顺序】:

     变量的初始化次序优于任何方法,甚至在构造方法的前面。对于static变量也是一样,

     如果变量是原始类型,那么它得到一个标准的原始类型的初始值,

     如果是一个对象的引用,除非你创建了一个新的对象给这个引用,否则就是null。

     static变量在需要的时候才会初始化,并且在这个类的构造函数和所有其他普通变量之前调用,static之后就不再进行初始化了,

     static变量在类初始化时(注意不是实例),就必须分配内存空间,

     static变量单独划分一块存储空间。

 

     java类首次装入时,会对静态成员变量或方法进行一次初始化,

     先初始化父类的静态代码-->初始化子类的静态代码-->

     (创建使历史,如果不创建实例,则后面的不执行)初始化父类的非静态代码-->初始化父类的构造

         -->初始化子类的非静态代码-->初始化子类的构造

 

     类只有在使用new调用创建的时候才会被java类装载器装入。

 

【final方法为何会高效】:

    final方法会在编译的过程中利用内嵌机制进行inline优化。

    inline优化是指:在编译的时候直接调用函数代码替换,而不是在运行时调用函数。

    inline需要在编译的时候就知道最后要用哪个函数,    

    显然,非final是不行的。

    非final方法可能在子类中被重写,由于可能出现多态的情况,编译器在编译阶段

    并不能确定将来调用方法的对象的真正类型,也就无法确定到底调用哪个方法。

 

【什么是多态】:

    按字面的意思是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。

    简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

 

【非final方法为什么会出现多态】:

    显然,如果派生出一个子类,覆盖非final方法,就会出现2个这样的方法可供调用,这就是多态。

 

【final变量的变与不变】:

    有人说final变量在赋值后就不可变,

    那么这个不变到底指的是什么呢?

    这个不变指的是引用,是地址,而所引用的对象的内容仍然是可变的。

    就是说,这个final变量永远指向某个对象,是一个常量指针,而不是指向常量的指针。

 

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

 

【final关键字的具体应用】:

    【final+变量】:

        在实际应用中,这种形式是非常少见的。

        比如logger是可以的,但是貌似并不是非常实用,或许用户仍然希望通过setter来改变logger变量。

    【static+final+变量】:

        常量。经常使用。

    【final+方法】:

        JDK中常用,但是自己并未常用。

    【final+类】:

        helper类经常使用。

    【final用于匿名内部类的参数传递】:

        在多线程测试时,经常使用。

    【final用于方法的参数】:

        并不常用。

分享到:
评论

相关推荐

    Java中final变量使用总结

    主要介绍了Java中final变量使用总结,final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值,通常final定义的变量为常量,需要的朋友可以参考下

    java final变量详解

    java final变量详解 java final变量详解 java final变量详解 java final变量详解

    Java中final作用于变量、参数、方法及类该如何处理

    Java中的final关键字非常重要,它可以应用于类、方法以及变量,下面这篇文章主要给大家介绍了关于Java中final作用于变量、参数、方法及类该如何处理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考...

    java中final关键字和static关键字详细用法

    根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。

    Java零基础-final关键字.md

    在阅读过程中,尝试编写简单的Java程序,体验final关键字的作用,并观察final变量和final方法的特性。 建议通过阅读相关的Java教材或搜索资料,进一步了解与final关键字相关的高级主题,如不可变类和Enum枚举等内容...

    深入理解Java final变量的内存模型

     在构造函数内对一个 final 域的写,与随后把这个构造对象的引用赋值给一个变量,这两个操作之间不能重排序  初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重排序  举...

    final修饰成员变量和局部变量.md

    本文章是关于final部分知识所作的自我总结,内容为final对成员变量和局部变量修饰的简要解答,除了对自我java学习的一个小结,也希望能够帮助到在java路上对该内容疑惑的同行

    举例讲解Java中final关键字的用法

    Java中的final关键字可以被用来修饰变量、方法和类等,意味着终结、不可改变,下面我们就来举例讲解Java中final关键字的用法:

    Java中final关键字详解

     在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。  1.修饰类  当用final修饰一个类时,表明这个类不能被继承。也就是说,...

    java_中的_final_变量[文].pdf

    java_中的_final_变量[文].pdf

    Java并发--final关键字.docx

    在Java中变量可以分为成员变量和局部变量 成员变量 通常每个类中成员变量可以分为 类变量(static修饰的变量) 以及 实例变量 针对这两种类型的变量...当final变量未初始化时系统不会进行隐式初始化,会出现报错。

    Java中final关键字的用法总结

    在Java中,final可以别用来修饰类、修饰方法、修饰变量和修饰参数等,这里就来简单作一个Java中final关键字的用法总结:

    Java SE编程入门教程 java static final(共24页).pptx

    Java SE编程入门教程 java static final(共24页).pptx Java SE编程入门教程 java this和super(共10页).pptx Java SE编程入门教程 java 常用API(共22页).pptx Java SE编程入门教程 javaGUI编程快速入门(1)(共...

    Java SE编程入门教程 java入门以及变量debug(共63页).pptx

    Java SE编程入门教程 java static final(共24页).pptx Java SE编程入门教程 java this和super(共10页).pptx Java SE编程入门教程 java 常用API(共22页).pptx Java SE编程入门教程 javaGUI编程快速入门(1)(共...

    Java中的final关键字详解及实例

    Java中的final关键字 1、修饰类的成员变量 这是final的主要用途之一,和C/C++的const,即该成员被修饰为常量,意味着不可修改。   上面的代码对age进行初始化后就不可再次赋值,否则编译时会报类似上图的错误。 ...

    【Java语言基础】final关键字

    【Java语言基础】final关键字 修饰词:final 最终的最后的 final关键字可用于修饰符,变量和方法,用于表示它修饰的类,方法和方法不可改变。 final 最终的最后的 final修饰变量时,表示该变量一旦获得了初始值之后...

    Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口

    在Java中, 可以使用final关键字修饰类、方法以及成员变量。 (1).final标记的类不能被继承; (2).final标记的方法不能被子类复写; (3).final标记的变量即成为常量,只能被赋值一次. 注意: 如果使用final来...

    java中final关键字使用示例详解

    Java中的final关键字非常重要,它可以应用于类、方法以及变量。这篇文章中带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使用final关键字的实例

    深入浅析Java中的final关键字

    在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量),下面通过本篇文章给大家介绍java中的final关键字,对java fina关键字相关知识感兴趣的朋友一起看看吧

    Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释.doc

    Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释.doc

Global site tag (gtag.js) - Google Analytics