final关键字详解

原创 2016年08月31日 16:45:44

final关键字的作用我想大家应该很清楚了,可以倒背如流了。

1.final属性是不可变的

2.final方法是不可覆盖的

3.final类是不可继承的

这篇博客是想再深入细致的说明一下final关键字。

首先说一下final属性,final属性分为成员属性和静态属性。我们知道,final属性必须要被显示初始化,且被初始化后不能再被赋值,但是显示初始化可以在三个地方进行,分别是定义的时候,构造方法中,初始化块中。注意,初始化不能在方法中进行,如果没有在上面三个地方进行赋值,那该属性就会被赋予默认值,不能再被更改,所以这个时候如果再在方法中进行初始化赋值,会有编译错误。也就是说声明final属性的时候,可以不直接赋值,在这三个地方也可以赋值,效果与声明时直接赋值是一样的。为什么呢?大家可以用javap -c 类名(这里类名不加.class后缀)来看一下字节码。发现在这三个地方赋值时,其实等效于都在构造方法中赋值。这样,我想大家就明白了上面的原因了吧。而静态属性跟普通属性是类似的,但是初始化时,只能在声明时和在静态代码块中赋值,用javap查看字节码时发现final静态属性在初始化时实际上都是在静态代码块中赋值的。另外,final变量不会采用默认初始值,必须要在上面说的三个地方显示初始化,不能在除上面说的三个地方之外赋值,否则编译时会报错。所以说final变量并不是变量的值不能被改变这么简单。

上面的理解了之后,再说一下java中“宏替换”的概念。宏替换本来是C语言中的概念,在C语言中用来常量替换。在java中也是一样的。用法是我们声明一个属性变量,无论静态还是非静态,该变量用final关键字,且初始化时要用直接值,这里的初始化只能是在声明时的初始化,而不能是变量或者表达式,这时这个final变量就是一个宏变量。宏变量最主要的特点就是,会在编译时期就把值确定下来,其实理解简单一点,宏变量就像是一个占位符一样,把调用该变量的地方,在编译时,将该变量替换为值。如果初始化时用的是变量或者表达式,则就只能在运行时才能赋值。

final方法是不能被覆盖的,这里强调一下就是,不要在final方法前加private,虽然没有语法错误,但是这样添加毫无意义。另外,当子类中有覆盖父类的方法时,即使没有加@Override注解,编译时也会失败报错。同样子类中如果要覆盖无法访问的父类方法时,也会出现这种情况。

最后说一下,final局部变量。只有当方法中使用内部类时,并且内部类会调用方法中的局部变量,这时这个局部变量才需要被声明为final,如果不声明,则编译时会报错。原因:首先局部变量声明为final时,该局部变量的生命周期就会变长,比所在的方法要长,因为内部类中使用该变量,有可能内部类的生命周期会比方法长,形成闭包,为了程序的健状性,所以需要加上final。最后补充一下,final局部变量在声明时,不会采用默认初始值,且不必在声明时就初始化,可以在后面赋值也行,但是必须要被赋值后才能使用,否则编译时会报错。且final局部变量不能被方法外部访问。

通过上面可以总结出,final变量必须要被初始化,且必须在指定的地方初始化,例如final静态变量只能在声明时和静态代码块中初始化,在其他地方初始化编译时会报错,final局部变量可以在所在方法的任意地方初始化。初始化之后就不能再被赋值。

相关文章推荐

stati、thi、supe、final关键字详解

  • 2008年11月20日 12:05
  • 58KB
  • 下载

Java关键字之final详解

在我们编写Java程序时总会根据需求将变量、方法、类设置成static(静态)或final(最终),熟练掌握final用法是必须的,现在我们就来详细了解final关键字! 一、final概述 概念:由...

Java内部类与final关键字详解

详解Java内部类与final关键字 内部类的几种创建方法: 1、成员内部类 class Outer{ private int i = 1; class Inner{ ...

Java中的关键字static、this、super、final详解

一、static 请先看下面这段程序: public class Hello{     public static void main(String[] args){//(1)       S...
  • kbest
  • kbest
  • 2011年08月15日 09:20
  • 1166

【Java编程】Java关键字final使用详解

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

Java基础(八) Java修饰符及接口详解之(一)static/final/abstract关键字及接口的使用

Java基础(八) Java修饰符及接口详解之(一)static/final/abstract关键字及接口的使用 static 修饰符 final 修饰符 abstract 修饰符 接口 访问控制 ...

Java final关键字详解

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

final关键字详解(超详细)参考(Thinking in java)

注:文章内容由网络及相关书籍整理而来,如此只为共享知识,给予帮助。 final 数据: 可以在编译时执行的计算,减轻了一些运行时的负担。基本数据类型在定义时,final修饰则必须赋值。对于基本 ...

JavaSE 第二十二讲:static于final关键字详解

1.接口(interface):接口的地位等同于Class,接口中的所有方法都是抽象方法。在声明接口中的方法时,可以使用abstract关键字,也可以不使用。通常情况下,都会省略掉abstract关键...

java笔记(四)[java中的import关键词&java中的javadoc用法及注释说明&java中的final关键字&java中的内部类详解]

1、 • import关键词的使用除了导入包外还可以导入静态方法和静态成员变量 2、 • 关于使用/** */生成javadoc的方法,在commend window 中转移到java文件的目录下,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:final关键字详解
举报原因:
原因补充:

(最多只允许输入30个字)