【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. echarts图形报表缓存问题(option数据缓存)

    这几天我在工作中用到了echarts开发报表.每次查询出来的数据都是新的,但是echart展现的图形报表却还是之前的数据.网上找了搜索了很多次也没能解决,后面加了技术群才解决的. 我开始已经确定是报表 ...

  2. 你以为border-radius只是圆角吗?【各种角度】

    border-radius,国内翻译成圆角,你可能以为这个属性就是用来画圆角,没错,但是除此之外,它还可以做点别的事情. radius其实指的是边框所在圆的半径,这个CSS3属性不仅能够创建圆角,还可 ...

  3. 入门教程: JS认证和WebAPI

    转自:http://www.jianshu.com/p/fde63052a3a5 本教程会介绍如何在前端JS程序中集成IdentityServer.因为所有的处理都在前端,我们会使用一个JS库oidc ...

  4. matplotlib绘制常用统计图

    常见统计图:单条折线图.多条折线图.直方图.柱状图.饼状图 #!/usr/bin/python # -*- coding: utf-8 -*- import numpy as np import ma ...

  5. Spark 开发环境搭建

    原文见   http://xiguada.org/spark-develop/ 本文基于Spark 0.9.0,由于它基于Scala 2.10,因此必须安装Scala 2.10,否则将无法运行Spar ...

  6. 我的mini_c语言文法设计

    //这个文件主要是用来描述当前源语言的词法结构和语法结构 //当前语言是c语言的一个子集,因此里面所有的描述大家都很熟悉 //注意,当前语言并不支持预处理,因为c预处理比较复杂,而且楼主能力低下,因此 ...

  7. block的知识点

    // //  main.m //  1211块练习 // //  Created by jerehedu on 14/12/11. //  Copyright (c) 2014年 jereh. All ...

  8. 我如何向HRMM介绍MICROSERVICE

    一天我司招才猫姐(HR 大人)问我,你给我解释一下 Microservice 是什么吧.故成此文.一切都是从一个创业公司开始的. 第一章:从集中到分权 最近的创业潮非常火爆,我禁不住诱惑也掺和了进去, ...

  9. 有些类库(node.js版)

    做项目经常会用到好些类库,大的还好说,用的多了自然记住了名字.如express. 但也有些小而精湛的类库,不仅提供了良好的功能,本身的实现也值得研究.暂记于此. 1.web类 request    简 ...

  10. NoSQL数据库介绍(2)

    2 NoSQL潮流      在这一章中,将一起讨论NoSQL潮流的动机和主要驱动力.以及NoSQL主张的批评和反馈.本章将通过不同的尝试得出结论来分类和描写叙述NoSQL数据库.当中一个分类法将在随 ...