关键词final的用法

1.用final声明常量的用法

        在编写程序时,经常需要声明一个数据是不可变的,该数据被称为常量。在Java中,
用final关键字修饰的变量,只能进行一次赋值操作,并且在在生存期内不可以改变它的值。
更重要的是,final会告诉编译器,这个数据是不会修改的,那么编译器就可能会在编译时期
就对该数据进行替换甚至执行计算,这样可以优化程序。不过在针对基本类型和引用类型
时,final关键字的效果存在细微差别。我们来看下面的例子:

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

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

        我们知道引用变量的值实际上是它所引用的对象的地址,也就是说该地址的值是不可改变的,从而说明为什么引用变量不可以改变引用对象。而实际引用的对象是不受final 关键字的影响的,所以它的值是可以改变的。

         因为final修饰的数据的值是不可改变的,所以我们必须确保在使用前就已经对成员变
量赋值了。因此对于final修饰的成员变量,我们有且只有两个地方可以给它赋值,一个是声明该成员时赋值,另一个是在构造方法中赋值。
         最后需要注意,同时使用static和 final 修饰的成员在内存中只占据一段不能改变的存储
空间。

2.用final声明方法的用法

(1)修饰方法参数

前面讲过,如果变量是我们自己创建的,那么使用final修饰表示只会给它赋值一次且不会改变变量的值。那么如果变量是作为参数传入的,我们怎么保证它的值不会改变呢?这就用到了final的第二种用法,即在编写方法时,可以在参数前面添加 final 关键字,它表示在整个方法中,我们不会改变参数的值。例如:

public class FinalTest{
        /*...*/
    public void finalFunc(final int i,final Value value){
        //i=5;不能改变i的值
        //v=new Value();不能改变v的值
        value.v=5;//可以改变引用对象的值
    }
    }

(2)修饰方法

用final关键字修饰方法,它表示该方法不能被覆盖。这种使用方式主要是从设计的角度考虑,即明确告诉其他写继承类的程序员,子类是不能覆盖该类的这个方法。关于private和final 关键字还有一点联系,这就是类中所有的private方法都隐式地指定为是final的,由于无法在类外使用private方法,所以也就无法覆盖它。

3.用final声明类

       使用final关键字修饰的类是无法被继承的。

        对于开发人员来讲,如果写的类被继承得越多,就说明写的类越有价值,越成功。即使是从设计的角度来讲,也没有必要将一个类设计为不可继承的。Java标难库就是一个很好的反例,特别是Java 1.0/1.1中Vector 类被如此广泛地运用,如果所有的方法均未被指定为final的话,它可能会更加有用。如此有用的类,我们很容易想到去继承和重写它们,然而,由于final的作用,我们对Vecttor类的扩展受到了一些阻碍,导致Vector并没有完全发挥它应有的全部价值。 

final 关键宇总结:
①用来修饰数据,包括成员变量和局部变量。该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值。
②用来修饰方法参数,表示在变量的生存期内它的值不能被改变。
③修饰方法,表示该方法无法被重写。
④修饰类,表示该类无法被继承。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值