快速业务通道

Java关键字介绍之final - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

Java关键字介绍之final

时间:2011-04-13 51cto hangjunhd

在Java中声明属性、方法和类时,可使用关键字final来修饰。final变量即为常量,只能 赋值一次;final方法不能被子类重写;final类不能被继承。

1.final成员

声明 final 字段有助于优化器作出更好的优化决定,因为如果编译器知道字段的值不会 更改,那么它能安全地在寄存器中高速缓存该值。final 字段还通过让编译器强制该字段为 只读来提供额外的安全级别。

1.1关于final成员赋值

1)在java中,普通变量可默认初始化。但是final类型的变量必须显式地初始化。

2)final 成员能且只能被初始化一次。

3)final成员必须在声明时(在final变量定义时直接给其赋值)或者在构造函数中被初 始化,而不能在其它的地方被初始化。

示例1 Bat.java

public class Bat {    final double PI = 3.14; // 在定义时赋值    final int i; // 因为要在构造函数中进行初始化,所以此处便不可再赋值    final List<Bat> list; // 因为要在构造函数中进行初始化,所以此处便不 可再赋值    Bat() {     i = 100;     list = new LinkedList<Bat>();    }    Bat(int ii, List<Bat> 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<Bat>();     System.out.println("I=" + b.i + " List Type:" + b.list.getClass());     b = new Bat(23, new ArrayList<Bat>());     b.list.add(new Bat());     System.out.println("I=" + b.i + " List Type:" + b.list.getClass());    } }

结果:

I=100 List Type:class java.util.LinkedList I=23 List Type:class java.util.ArrayList

在main方法中有两行语句注释掉了,如果你去掉注释,程序便无法通过编译,这便是说, 不论是i的值或是list的类型,一旦初始化,确实无法再更改。然而b可以通过重新初始化来 指定i的值或list的类型。

Java关键字介绍之final(2)

时间:2011-04-13 51cto hangjunhd

1.2 final引用字段的无效初始化

要正确使用final字段有点麻烦,对于其构造子能抛出异常的对象引用来说尤其如此。因 为 final 字段在每个构造器中必须只初始化一次,如果 final 对象引用的构造器可能抛出 异常,编译器可能会报错,说该字段没有被初始化。编译器一般比较智能化,足以发现在两 个互斥代码分支(比如,if...else 块)的每个分支中的初始化恰好只进行了一次,但是它 对 try...catch 块通常不会如此“宽容”。

下面这段代码通常会出现问题。

class Thingie {    public static Thingie getDefaultThingie() {     return new Thingie();    } } public class Foo {    private final Thingie thingie;    public Foo() {     try {       thingie = new Thingie();     } catch (Exception e) {       thingie = Thingie.getDefaultThingie();//Error:The final field thingie may already have been assigned     }    } }

你可以这样修改。

public class Foo {    private final Thingie thingie;    public Foo() {     Thingie tempThingie;     try {       tempThingie = new Thingie();     } catch (Exception e) {       tempThingie = Thingie.getDefaultThingie();     }     thingie = tempThingie;    } }

1.3关于final成员使用

当你在类中定义变量时,在其

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号