final的用法

来源:互联网 发布:辐射4超低配优化ini 编辑:程序博客网 时间:2024/05/16 06:38

    面试的时候,经常被问到final不同用法的区别,所以特意总结一下。

   使用final主要有三种情况:数据,方法和类。

  1. final数据

    用于基本数据类型,final使数值恒定不变;用于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象后,就无法把它改为指向另一个对象。但是,对象其自身是可以被修改的。如下例

class Value{

    int i;

    public Value(int i){

       this.i = i;

    }

}

 

public class FinalData {

    private int k = 0;

    private final int j = 0;

    private Value v1 = new Value(13);

    private final Value v2 = new Value(12);

   

    public static void main(String[] args) {

       FinalData data = new FinalData();

       data.k = 1;

//     data.j = 1;//无法通过编译,因为j是基本类型,被声明为final后,无法改变其数值

      

        data.v1 = new Value(12);

//      data.v2 = new Value(12);//无法通过编译,final用于对象引用时,这个引用无法在指向别的对象,但是可以修改这个对象本身

        data.v2.i = 12;//可以改变对象本身

    }

}

    补充说一点,final对象在使用前一定要被初始化,所以一般都是在声明的时候就进行初始化。如果不能再声明时立马初始化,那就要在构造器里对final数据进行初始化。

  1. final参数

    可以在参数列表中将参数声明为final,这样在方法中就无法更改参数引用所指向的对象了,这一特性主要用来向匿名内部类传递数据。

    public void print(final String str){

           //str = "abc";//无法通过编译

    }

  1. final 方法

    final修饰的方法无法在子类中被覆盖

class SuperClass {

    public final void div() {

 

    }

}

 

public class Child extends SuperClass {

 

    // public final void div() {

    // 不能覆盖final方法

    // }

 

}

  1. final 

    当将某个类整体定义为final时,这个类无法被别的类继承。

final class Value{

  int i;

  public Value(int i){

     this.i = i;

  }

}

 

//无法通过编译

class Child extends Value{

 

}

 

0 0
原创粉丝点击