Java基础------知识点整理(四)-----final关键字

来源:互联网 发布:me544j支持什么网络 编辑:程序博客网 时间:2024/06/08 15:25

final通常指“这是无法改变的”,不想做改变可能处于两处理由:设计或效率,final可以当成是“最终版本”!

final能修饰三种情况: 数据(基本变量和对象)、方法、类

1.final数据

1.1   修饰的数据特点

(1)final修饰的常量必须是基本类型,此时final修饰的常量数值将恒定不变

(2)final修饰对象引用时,final仅仅使引用恒定不变,而不是使对象的值不变。也就是说,一旦被final修饰的引用被初始化指向一个对象后,就无法再把它改为指向另一个对象。           然而对象本身是可以修改的(java中没有使任何对象很定不变的途径),这一限制同样适用于数组,它也是对象

1.2static和final

static和final常常联合使用,例如private   static   final   int   VALUE_ONE = 99;

然而不加static只有final还是有点小的区别的,stati修饰后,在装载时就已经初始化,而不是每次创建对象时才初始化,此时static强调这个变量只有一份,final是说明它是一个常量


1.3 空白final

所谓空白final是指被final声明担忧为给定初值的域,但是编译器会确保空白final在使用前必须被初始化。但是空白final在关键字final的使用提供了更大的灵活性。

为了确保final定义的在使用前被初始化,空白final这种形式常用在  在构造函数进行初始化,例子如下:

class BlankFinal{    private  final  int  j;    private   final  Person  p;    public   BlankFinal(){        j = 1;        p = new Person();    }    public BlankFinal(int x){        j = x;        p = new Person(x);//加入类Person中有Person(int   x)这样的构造函数    }}


这样就会发现使得final定义的更加灵活性,而且还能保证是final的


1.4  final  参数

final参数就是指在方法的参数列表中,将参数指定为final,这样的目的是:你无法在方法中更改参数引用所指向的对象

class  Gizmo{    public   void   spin(){}}public  class   FinalArguments{    void with(final  Gizmo  g){    // !  g = new Gizmo()  不可以,因为g是final的    }    void without(Gizmo  g){        g = new Gizmo();        g.spin();    }}


2 final方法

final修饰的方法,在被继承后不会被覆盖;

有些类中的方法是很底层的需要固定住,不能改变。但假如子类继承过来后,不故意也有一个同名的函数就可能改变原来的方法将其覆盖,所以用final修饰

在以前用final还因为可以提高效率


2.1 final和private关键字

类中所有的private方法都算是隐式的定义为final的,由于无法取用private方法,所以也就无法覆盖它


3.final类

有些类不想被继承,就用final修饰


4有关final的忠告

(1)在设计类时,讲方法指明是final是明智的

(2)Vector和Hashtab里面的方法都没有final修饰

0 0
原创粉丝点击