网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  java语言深入 final在java中的应用     
  文章作者:未知  文章来源:水木森林  
  查看:62次  录入:管理员--2007-11-17  
 
  final在java中并不常用,然而它却为我们提供了诸如在c语言中定义常量的功能,不仅如此,final还可以让你控制你的成员、方法或者是一个类是否可被覆写或继承等功能,这些特点使final在java中拥有了一个不可或缺的地位,也是学习java时必须要知道和掌握的关键字之一。
final成员
  当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。下面这段代码演示了这一点:
import java.util.list;
import java.util.arraylist;
import java.util.linkedlist;
public class bat{
    final 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;
        //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的常规用法。在这里使用在构造函数中进行初始化的方法,这使你有了一点灵活性。如bat的两个重载构造函数所示,第一个缺省构造函数会为你提供默认的值,重载的那个构造函数会根据你所提供的值或类型为final变量初始化。然而有时你并不需要这种灵活性,你只需要在定义时便给定其值并永不变化,这时就不要再用这种方法。在main方法中有两行语句注释掉了,如果你去掉注释,程序便无法通过编译,这便是说,不论是i的值或是 list的类型,一旦初始化,确实无法再更改。然而b可以通过重新初始化来指定i的值或list的类型,输出结果中显示了这一点:
i=100 list type:class java.util.linkedlist
i=23 list type:class java.util.arraylist
  还有一种用法是定义方法中的参数为final,对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说你可以在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。
另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用,如下代码所示:
public class inclass{
   void innerclass(final string str){
        class iclass{
            iclass(){
                system.out.println(str);
            }
        }
        iclass ic=new iclass();
    }
  public static void main(string[] args){
      inclass inc=new inclass();
      inc.innerclass("hello");
  }
}
final方法
  将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。
final类
  当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了 final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。
  下面的程序演示了final方法和final类的用法:
final class final{
    final string str="final data";
    public string str1="non final data";
    final public void print(){
        system.out.println("final method.");
    }
    public void what(){
        system.out.println(str+"/n"+str1);
    }
}
public class finaldemo {   //extends final 无法继承 
    public static void main(string[] args){
        final f=new final();
        f.what();
        f.print();
    }
}
  从程序中可以看出,final类与普通类的使用几乎没有差别,只是它失去了被继承的特性。final方法与非final方法的区别也很难从程序行看出,只是记住慎用。
final在设计模式中的应用
  在设计模式中有一种模式叫做不变模式,在java中通过final关键字可以很容易的实现这个模式,在讲解final成员时用到的程序bat.java就是一个不变模式的例子。如果你对此感兴趣,可以参考阎宏博士编写的《java与模式》一书中的讲解。
  到此为止,this,static,super和final的使用已经说完了,如果你对这四个关键字已经能够大致说出它们的区别与用法,那便说明你基本已经掌握。然而,世界上的任何东西都不是完美无缺的,java提供这四个关键字,给程序员的编程带来了很大的便利,但并不是说要让你到处使用,一旦达到滥用的程序,便适得其反,所以在使用时请一定要认真考虑。 
 
 
上一篇: 在eclipse rcp中实现控制反转(ioc)    下一篇: jboss4.x下第一个ejb2.x程序
  相关文档
eclipse 3.2 m6 发布 11-17
程序人生:java三个月—oop的乐趣 11-17
关于构建一个使用ejb组件的新系统 11-17
tofixed 方法 11-16
java应用程序中加载位图文件的逐步指南 11-17
课程介绍(6)sl-285 高级java编程工具包 11-16
java应用开发中jdbc接口技术的介绍 11-17
用java动态代理类实现记忆功能 11-17
循序渐进学习junit 11-17
number 属性 11-16
用java annotations管理对象生命周期 11-17
应用bea workshop jsp editor开发web应用 11-17
最大化weblogic集群性能、可用性和安全 11-16
剖析.net下的数据访问层技术(4) 11-17
tomcat连接池的配置 11-17
java语言高级:深入浅出面向对象的复用 11-16
scjp认证套题解析之四 11-16
深入掌握java技术 关于ejb调用原理分析 12-11
一起来学java吧 11-17
试析j2ee与.net时代的商业利润(转) 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息