Java final的回顾

final成员变量
在类中定义变量时,在其前面加上final关键字,是说该变量一旦被初始化便不可改变。(1)对基本类型来说是其值不可变,(2)而对于对象变量来说其引用不可再变但引用变量所指向的对象中的内容还是可以改变的

final方法
(1)将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。(2)另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。


final类
当你将final用于类身上时,你就需要仔细考虑,(1)因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。(2)对于final类中的成员,你可以定义其为final,也可以不是final。(3)而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。


final变量的初始化可以在三种情况:
一是其定义处,也就是说在final变量定义时直接给其赋值,
二是在构造函数中。而且在Java1.1以前,只能是在定义时给值。
三是在初如化代码块中{} 或者 static{}

下面这段代码演示了这一点:更加详细的探讨请参考

关于final变量的初始化探讨

或者: http://blog.sina.com.cn/s/blog_4de067e40100kx60.html

import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

public class Bat {

    final double PI = 3.14; // 在定义时便给址值
    final int i; // 因为要在构造函数中进行初始化,所以此处便不可再给值
    final List list; // 此变量也与上面的一样

    Bat() {
        i = 100;
        list = new LinkedList();
    }

    Bat(int ii, List l) {
        i = ii;
        list = l;
    }

    public static void main(String[] args) {
        Bat b = new Bat();
        b.list.add(new Bat()); //引用不可变,但引用指向的内容是可以变的
        // b.i=25;   syntax error  i是不可变的
        //b.list=new ArrayList(); 错误,对象引用是不可变的
        System.out.println("I=" + b.i + " List Type:" + b.list.getClass());
        b = new Bat(23, new ArrayList());
        b.list.add(new Bat());
        System.out.println("I=" + b.i + " List Type:" + b.list.getClass());
    }
}


再例如,对于如下语句:

final StringBuffer a=new StringBuffer("immutable");
  执行如下语句将报告编译期错误:

a=new StringBuffer("");
  但是,执行如下语句则可以通过编译:

a.append(" broken!"); 

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:

public void method(final  StringBuffer  param)

{

}

实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象,其它对象亦如此:

  param.append("a");



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值