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局部变量可以在所在方法的任意地方初始化。初始化之后就不能再被赋值。

第十七课 final关键字和abstract关键字

 一、final关键字 final(最终)是一个修饰符 1.final可以修饰类,函数,变量(成员变量,局部变量) 2.被final修饰后的类不可以被其他类继承 3.被final修饰...
  • razeSpirit
  • razeSpirit
  • 2014年11月18日 15:57
  • 7853

Java关键字final、static、abstract使用总结

一、final 根据程序上下文环境,Java关键字final有“无法改变”或者“终态”的含义,它可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,没有子类,final类中的方法默认...
  • u013842976
  • u013842976
  • 2016年05月10日 13:48
  • 1344

c++11特性之override和final关键字

C++11之前,一直没有继承控制关键字。禁用一个类的进一步衍生是可能的但也很棘手。为避免用户在派生类中重载一个虚函数,你不得不向后考虑。C++ 11添加了两个继承控制关键字:override和fina...
  • wangshubo1989
  • wangshubo1989
  • 2015年11月01日 00:19
  • 12491

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

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

JAVA面向对象之final关键字与多态详解

JAVA面向对象 final关键字(绝育的) 特点 1.修饰方法 作用 这个被修饰的方法不能被重写 2.修饰变量 作用 修饰的基本数据类型的变量 不能被重新复制 ...
  • liurongsheng123
  • liurongsheng123
  • 2018年01月11日 21:04
  • 54

java详解 --- 代码块、继承以及final关键字

一.代码块代码块是一种常见的代码形式。他用大括号“{}”将多行代码封装在一起,形成一个独立的代码区,这就构成了代码块.而代码块又分为四种. 1.局部代码块 在方法中用一对大括号括起来代码.局部代码...
  • zxc1258012580
  • zxc1258012580
  • 2017年12月07日 21:02
  • 58

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

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

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

1、 • import关键词的使用除了导入包外还可以导入静态方法和静态成员变量 2、 • 关于使用/** */生成javadoc的方法,在commend window 中转移到java文件的目录下,...
  • Zhipeng_Hou
  • Zhipeng_Hou
  • 2015年08月08日 11:32
  • 451

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

Java基础(八) Java修饰符及接口详解之(一)static/final/abstract关键字及接口的使用 static 修饰符 final 修饰符 abstract 修饰符 接口 访问控制 ...
  • u010416101
  • u010416101
  • 2017年03月26日 19:23
  • 717

java中final关键字详解

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。下...
  • u012422446
  • u012422446
  • 2015年07月23日 10:48
  • 283
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:final关键字详解
举报原因:
原因补充:

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