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

并不常用。

本文转自:http://wenjiesu.iteye.com/blog/799332

java中final关键字的使用方法的更多相关文章

  1. Java中final关键字修饰变量、方法、类的含义是什么

    Java中的关键字final修饰变量.方法.类分别表示什么含义? 先看一个简单的介绍 修饰对象 解释说明 备注 类 无子类,不可以被继承,更不可能被重写. final类中的方法默认是final的 方法 ...

  2. java中final 关键字的作用

    final 关键字的作用 java中的final关键字可以用来声明成员变量.本地变量.类.方法,并且经常和static一起使用声明常量. final关键字的含义: final在Java中是一个保留的关 ...

  3. 关于Java中final关键字的详细介绍

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

  4. java 中final关键字

    1.final变量,一旦该变量被设定,就不可以再改变该变量的值. final关键字定义的变量必须声明时赋值.一旦一个对象引用被修饰为final后,它只能恒定指向一个对象,一个既是static和fina ...

  5. Java中final关键字概述

    使用final修饰过的变量都不可以改变: 1.final修饰变量 恒定不变的属性,可以用final关键字来修饰: 变量名建议全部使用大写 final修饰的变量不能改变,如果程序中重新赋值,编译报错 例 ...

  6. 解析Java中final关键字的各种用法

    首先,我们可以从字面上理解一下final这个英文单词的中文含义:“最后的,最终的; 决定性的; 不可更改的:”.显然,final关键词如果用中文来解释,“不可更改的”更为合适.当你在编写程序,可能会遇 ...

  7. 关于java中final关键字与线程安全性

    在Java5中,final关键字是非常重要而事实上却经常被忽视其作为同步的作用.本质上讲,final能够做出如下保证:当你创建一个对象时,使用final关键字能够使得另一个线程不会访问到处于" ...

  8. JAVA中final关键字的作用

    一.final关键字的功能概述 final关键字可以用来修饰引用.方法和类. 1.用来修饰一个引用 如果引用为基本数据类型,则该引用为常量,该值无法修改: 如果引用为引用数据类型,比如对象.数组,则该 ...

  9. java中new关键字和newInstance()方法有什么区别?

    1.new可以调用带参数的构造函数,newInstance不可以. 2.new 是 java 的关键字,用来构造一个类的实例.而 newInstance 是 Class 的一个方法,不过两个写法的效果 ...

随机推荐

  1. Tomcat9 访问 Manager App

    1.介绍 在配置好Tomcat,我们往往需要访问Tomcat的Manager以及Host Manager.就需要在tomcat-users.xml中配置用户角色来实现.在地址栏输入:localhost ...

  2. js 获取两位小数的方法

    1. 最笨的办法 function get() { var s = 22.127456 + ""; var str = s.substring(0,s.indexOf(" ...

  3. Linux115条常用命令

    1,echo “aa” > test.txt 和 echo “bb” >> test.txt //>将原文件清空,并且内容写入到文件中,>>将内容放到文件的尾部2, ...

  4. An incompatible version 1.1.14 of APR based Apache Tomcat Native library is installed, while Tomcat

    启动tomcat 7.0, 看到日志里出现严重警告, An incompatible version 1.1.14 of APR based Apache Tomcat Native library ...

  5. java二维码小试牛刀

    旁白: 由于工作需要,要做一个java的二维码的图片,花了2天的时间学习了一下,过程中也遇到了一些问题,这里做个笔记,收藏了. 废话不多说了,入题吧! 转自:http://www.open-open. ...

  6. set_exception_handler 自定义异常处理

    该函数用于创建运行时期间的用户自己的异常处理方法. set_exception_handler(error_function) 参数 必需.规定未捕获的异常发生时调用的函数. 该函数必须在调用 set ...

  7. wamp server php环境绑定域名

    思路: 用花生壳做动态域名解析 用wamp server 在本机上做一个 php web server; 这样就可以让一台内网电脑做一个测试用的服务器: 一:wamp server php环境绑定域名 ...

  8. CAS 与 无锁队列

    http://coolshell.cn/articles/8239.html http://www.tuicool.com/articles/VZ3IBv http://blog.csdn.net/r ...

  9. vi/vim 查找替换命令

    vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询.    :s/vivian/sky/ 替换当前行第一个 vivian ...

  10. DevExpress SpinEdit控件使用实例——删除ASPxSpinEdit右边的上下小箭头SpinButtons-ShowIncrementButtons

    使用ASPxSpinEdit来添加数字类型的输入框: 默认情况下, SpinEdit通过点击右边的上下箭头来加减number,下面的代码是去掉上下箭头,内容居中显示,并将边框颜色置为白色: <d ...