Java中的final

来源:互联网 发布:淘宝电子面单打印软件 编辑:程序博客网 时间:2024/06/11 18:46

Java中的final

英语阅读中,final常被译为”最终的”。在Java中,另一种解释更合乎语境:”不能更改的”。即,被final修饰了的都是不能再改的。

final可以修饰数据、方法和类。

final修饰数据

1 final修饰基本数据类型,定义时必须赋值。如:

private final int value=9;public void change(){     value=10;  //Error:can't change it}

与static的区别:static强调该类所有对象都共享这一份数据,数据是可以改变的;final强调该数据不能再改变。

private static int value=9;public void change(){     value=10;  //OK}

2 final修饰对象引用,引用不可再改变,对象本身可以改变。如:

private final int[] a={1,2,3,4};public void changeObject(){    a[0]=7; //ok,change the object}public void changeReference(){    a=new int[3]; //Error,can't change reference}

3 一个有趣的现象是,Java允许空白final的存在,这似乎与前面所说的定义时必须赋值矛盾。所以,更正为使用前必须初始化完毕更为准确。空白final为程序带来了更大的灵活性。而编译器是可以保证空白final在使用前必须初始化的,因为我们总会在定义处或构造器中完成初始化。

public class TestFinal {    private final int  i;    public TestFinal(){        i=0;        System.out.println("TestFinal("+i+")");    }    public TestFinal(int value){        i=value;        System.out.println("TestFinal("+i+")");    }    public static void main(String args[]){        TestFinal t1=new TestFinal();        TestFinal t2=new TestFinal(3);    }} 

4 final修饰参数,意味着不能在方法中改变该参数。如:

public void change(final int[] a){    a[0]=7; //OK    a=new int[8]; //Error,can't change}

final修饰方法

1 方法需要final修饰,通常出于两个考虑:
设计:锁定方法,防止派生类修改。
效率:早期Java中,被final修饰的方法,意味着编译器对该方法的调用都转为内嵌调用。但内嵌调用可能会带来程序代码膨胀的后果,反而会影响效率。因此,后期的Java中,final只用来禁止覆盖。

2 final和private
其实,类中所有的private方法都是被隐式地指定为final的,由于无法获取private方法,也就没有办法覆盖它。因此,对某个private方法增加final修饰,并不会带来额外的意义。

final修饰类

final修饰类,表示不允许继承该类,也不允许对该类有任何改动。
final类中的域与非final类中的域规则一样;final类中的方法被隐式指定为final。

0 0
原创粉丝点击