首页 > 技术文章 > Java final关键字

naihuangbao 2018-08-26 13:49 原文

在java的关键字中,staticfinal是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。

1.fianl变量

fianl关键字可以用于声明变量,一旦该变量被设定,就不能更改该变量的值,并且定义的变量必须在声明时对其进行赋值操作。一旦一个对象引用被修饰为final后,它只能恒定指向一个对象,无法将其改变指向另一个对象。为了深入了解final关键字,我们看以下实例。

 

class Value {
   int v;
   public Value(int v) {
       this.v = v;
   }
}
public class FinalTest {
   final int f1 = 1;
   final int f2;
   public FinalTest() {
       f2 = 2;
   }
   public static void main(String[] args) {
       final int value1 = 1;
       // value1 = 4;
       final double value2;
       value2 = 2.0;
       final Value value3 = new Value(1);
       value3.v = 4;
   }
}

 

上面的例子中,我们先来看一下main方法中的几个final修饰的数据,在给value1赋初始值之后,我们无法再对value1的值进行修改,final关键字起到了常量的作用。从value2我们可以看到,final修饰的变量可以不在声明时赋值,即可以先声明,后赋值。value3时一个引用变量,这里我们可以看到final修饰引用变量时,只是限定了引用变量的引用不可改变,即不能将value3再次引用另一个Value对象,但是引用的对象的值是可以改变的。

2.final方法

用final关键字修饰方法,它表示该方法不能被覆盖。这种使用方式主要是从设计的角度考虑,即明确告诉其他可能会继承该类的程序员,不希望他们去覆盖这个方法。这种方式我们很容易理解,然而,关于private和final关键字还有一点联系,这就是类中所有的private方法都隐式地指定为是final的,由于无法在类外使用private方法,所以也就无法覆盖它。看以下实例。

 

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(){     //在子类中定义一个doit()方法
   System.out.println("子类.doit()");
 }
 /* final void doit2(){
   System.out.println("子类.doit2()");  //Sub中的doit2()无法覆盖Parents中的doit2()
 } */
 public void doit3(){
   System.out.println("子类.doit3()");
 }
}
public class FinalMethod{
 public static void main(String[] args){
 Sub t=new Sub();  //实例化一个子类对象
 t.doit();        //调用子类对象的doit()方法
 Parents p=t;   //子类对象向上转型为父类对象
 //p.doit();   doit()方法定义为private,子类不能访问
 p.doit2();    //调用父类对象的doit2()方法
 p.doit3();    //覆盖,覆盖必须满足一个对象向上转型为它的基本类型并调用相同方法
}
}

 

从本实例可以看出,final方法不能被覆盖,覆盖必须满足一个对象向上转型为它的基本类型并调用相同方法这样一个条件,例如在子方法中,Parents p=t; 子类对象向上转型为父类对象,对象p只能调用正常覆盖的doit3()方法,却不能调用doit()方法。

3.final类

了解了final关键字的其他用法,我们很容易可以想到使用final关键字修饰类的作用,那就是用final修饰的类是无法被继承的。如果将一个类设置为final类型,则类中的所有方法都被隐式设置为final形式,final类中的成员变量可以被设置为final或非final类型。看以下实例。

 

final class FinalClass{
 int a=3;
 public static void main(String[] args){
   FinalClass t=new FinalClass();
       t.a++;
   System.out.println(t.a);  //输出a=4
 }
}

搜索微信公众号“程序员考拉”,欢迎关注!

推荐阅读