资讯专栏INFORMATION COLUMN

[转] 再论 java 中的 final 变量

soasme / 1227人阅读

摘要:的内存分配方式修饰变量通常情况下,变量有个地方可以赋值直接赋值,构造函数中,或是初始化块中。如就是对于变量,在声明时,如果你没有赋值,系统默认这是一个空白域,在构造函数进行初始化,如果是静态的,则可以在初始化块。

【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用于方法的参数】:
    并不常用。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65327.html

相关文章

  • Java 多态(8)

    摘要:在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征。 在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征。 1.再论向上转型 多态作用:消除类型之间的耦合关系. 2.转机 绑定:将一个方法调用同一个方法主体关联起来. 前期绑定:在程序执行前就进行绑定(面向过程语言默认绑定方式). 后期绑定:也叫动态绑定或运行时绑定,在运行时根据对象的类型进行绑...

    v1 评论0 收藏0
  • Java编程思想》笔记8.多态

    摘要:多态的作用是消除类型之间的耦合关系。编写构造器准则用尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法。 点击进入我的博客 在面向对象的程序设计语言中,多态是继数据抽象(封装)和继承之后的第三种基本特征。多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来。多态的作用是消除类型之间的耦合关系。 8.1 再论向上转型 对象既可以作为它自己的本类使用,也可以作为它的...

    chinafgj 评论0 收藏0
  • 鸟瞰前端 , 再论性能优化

    摘要:前端性能优化的涉及点从服务器到协议再到宿主环境本身都要有比较深刻的认识,业界目前主要还是以雅虎总结出来条前端性能优化的黄金军规为参考。 欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 导语 : 从事前端有6年+的时间了,从最开始的美工到重构再到偏向js逻辑开发的前端开发,一直在前端这个行业里面摸索和学习,我现在将自己这些年的一个心得体会来个系统性的梳理写成一篇关于性能优化...

    voidking 评论0 收藏0
  • | Java8初体验(一)lambda表达式语法

    摘要:初体验下面进入本文的正题表达式。接下来展示表达式和其好基友的配合。吐槽一下方法引用表面上看起来方法引用和构造器引用进一步简化了表达式的书写,但是个人觉得这方面没有的下划线语法更加通用。 感谢同事【天锦】的投稿。投稿请联系 tengfei@ifeve.com 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘。因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解偏...

    Lucky_Boy 评论0 收藏0
  • [零基础学python]编写类之四再论继承

    摘要:从运行结果可以看出,当子类继承多个父类的时候,对于构造函数,只有第一个能够被继承,第二个就等掉了。重点看,类继承了,同时,在构造函数中自己做了规定,也就是的构造函数是按照的意愿执行,不执行的内容,但是,还有一个方法,则继承了这个方法。 在上一讲代码的基础上,做进一步修改,成为了如下程序,请看官研习这个程序: #!/usr/bin/env python #coding:utf-8 c...

    BoYang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<