1, final成员 :
当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。下面这段代码演示了这一点:
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( )); ----- final定义的对象引用不可以改变,但是指向的对象内容可以修改,Add,remove等
//b.i=25; ----- final定义的基本类型不可以修改变化
//b.list=new ArrayList( );----- final定义的对象引用不可以改变
System .out.println("I=" +b.i+" List Type:" +b.list.getClass());
b=new Bat(23,new ArrayList ());----- final定义的对象引用可以重新
b.list.add(new Bat());
System .out.println("I=" +b.i+" List Type:" +b.list.getClass());
}
}
在main方法中有两行语句注释掉了,如果你去掉注释,程序便无法通过编译,这便是说,不论是i的值或是list的类型,一旦初始化,确实无法再更改。然而b可以通过重新初始化来指定i的值或list的类型.
I=100 List Type:class java.util.LinkedList
I=23 List Type:class java.util.ArrayList
2, 定义方法中的参数为final:
对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说你可以在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量.
3, 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数据
对primitive来说,final会将这个值定义成常量,在定义时赋值;既是static又是final的数据成员会只占据一段内存,并且不可修改。 对reference来说,final的意思则是这个reference是常量,初始化的时候,一旦将reference连接到某个对象,那么它就再也不能指别的对象了,但这个对象本身是可以修改的,Java没有提供将某个对象当作常量的方法。
final 方法
禁止派生类修改该方法!
final和private
Private方法已经隐含有final的意思,因为外部是不能访问private的,也就不存在覆写它。
final类
出于类的设计考虑,它再也不需要作修改了;或者从安全角度出发,不希望它再派生出子类。
final类的数据可以是final的,也可以不是final的,这由自己决定;对于它的方法,由于final类禁止了继承,覆写方法已经不可能,所以所有的方法都隐含地变成final的了!
删除 teacodeing (2011-11-18 11:33:34, 评分: 5 )
评 5 分