final关键可以用于变量声明,一旦变量被设定,就不可以改变变量的值。
由final变量定义的变量为常量。
final double PI=3.14;当在程序中使用PI这个常量时候,它的值为3.14,。
final关键字定义的变量必须在声明时对其进行赋值操作。
final可以修饰基本数据类型常量、修饰对象引用、修饰数组,一旦被final修饰后,他只能恒定指定一个对象,无法改变以指向另一个对象。
例:在com.fan包中创建FinalTest类,定义各种类型的final变量。
package com.fan; import static java.lang.System.out; import java.util.Random; class Test{ int i=0; } public class FinalTest { static Random rand=new Random(); private final int VALUE_1=1; private static final int VALUE_2=2; private final Test test=new Test(); private Test test2=new Test(); private final int[] a={1,2,3,4,5,6,7,8}; }被定义的final的常量定义时需要使用大写字母命名规则。
在java中定义的全局变量,通常使用public static final修饰,这样的常量只能在定义时被赋值。
final数据可以出现的位置:
final成员变量不可以改变;
在声明final成员变量时,没有赋值,称为空白final;
在构造方法中为空白final赋值;
设置final参数,不可以改变参数x的值;
局部变量定义为final,不可以改变i的值;
定义为final的方法不能被重写。
将方法定义为final类型可以防止子类修改该类的定义与实现的方法,同时定义为final的方法的执行效率要高于非final方法。
class Parents{ private final void doit(){ System.out.println("父类.doit()"); } final void doit2(){ System.out.println("父类.doit2()"); } public void doit3(){ System.out.println("父类.doit3()"); } } class Sub extends Parents{ public final void doit(){ System.out.println("子类doit()"); } //final方法不可以覆盖 // final void doit2(){ // System.out.println("子类doit2()"); //} public void doit3(){ System.out.println("子类doit3()"); } } public class FinalMethod { public static void main(String[] args){ Sub s=new Sub();//实例化 s.doit();//调用doit方法 Parents p=s;//执行向上转型 //p.doit();//不能调用private方法 p.doit2(); p.doit3(); } }结果显示:
子类doit() 父类.doit2() 子类doit3()从本例子可以看出,final方法不可以被覆盖。
定义为final类不可以被继承。
如果你希望一个类不允许任何类继承,并且不允许其它人对于这个类进行任何改动,可以定义为final形式。
final类格式如下:
final 类名{}如果某个类设置成final形式,则类中所有方法都被隐藏设置为final形式,但final成员变量可以被定义为final或非final形式。
例如:
final class Finalclass { int a=8; void doit(){ } public static void main(String[] args){ Finalclass f=new Finalclass(); f.a++; System.out.println(f.a); } }结果显示:
9