Java中使用到final关键字的三种情况:数据、方法和类
1.final用来修饰数据
1)用来表明该数据是恒定不变的
2)对于编译期常量这种情况,编译器可以将该常量值带入任何可能用到它的计算式中,意思就是说,在编译时执行计算式,这样可以减轻运行时的负担。在JAVA中,这类的常量必须是基本的数据类型,并且是以final关键字表示。在对这个常量进行定义的时候,必须对其进行赋值。
3)当对对象的引用而不是基本数据类型时,且用final修饰,对于基本的数据类型而言,final是使数值恒定不变的‘而对于对象引用而言,final使引用恒定不变。一旦引用被初始化指向一个对象,则没有办法再指向另外一个对象。但是,对象自身是可以被修改的,java并未提供使任何对象恒定不变的途径。
4)带有final static 修饰的基本类型全用大写字母命名,并且字与字之间用下划线隔开。
2.空白final
1)java允许生成空白final,其指被声明为final但又未给定初值的域。不管什么情况下,编译器都确保空白final在使用前必须被初始化。
2)关于空白final的初始化,必须在域的定义处或者每个构造器中用表达式对final进行赋值,这就是final域在使用前总是被初始化的原因所在
3.final修饰参数
1)java允许在参数列表中以声明的方式将参数声明为final,这也就意味着你没有办法再方法中更改参数引用所指向的对象。
2)你可以读取final所修饰的参数,但是没有办法来改变这个参数的值。这个特性主要用来向匿名内部类传递数据
4.final用来修饰方法
1)final用来修饰方法的原因有两个:
a)把方法锁定,防止任何继承类来修改它的含义,这是出于设计的考虑
b)明确禁止方法被覆盖
注:类中所有的private方法都隐式的指定为final,由于无法取用private方法,所以就无法覆盖它。
“覆盖”只有在某方法是基类的接口的一部分时才会出现。即,必须能将一个对象向上转型为该基本类型并调用相同的方法,如果某方法为private,他就不是基类的接口的一部分。他仅是隐藏域基类中的程序代码,只不过是具有相同的名称而已。但是如果其子类中以相同的名称生成一个public ,protected或包访问权限方法的话,仅仅是生成了一个新的方法,由于private方法无法触及而且能有效的隐藏,所以除了把它看成是因为他所属的类的组织结构的原因而存在外,其他任何事物都不需要考虑他
5.final修饰类
当将某个类的整体用final修饰时(通常是将关键字final置于他的定义之前),就表明了你不打算继承该类,而且也不允许别人这样做,而且由于final类 禁止继承,所以final类中的所有方法都隐式的定义为final,因为他们是无法覆盖的。