关于Java中的final

Java中的final共有三种用法:

final成员变量
当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变但引用变量所指向的对象中的内容还是可以改变的

其初始化可以在三个地方,
一是其定义处,也就是说在final变量定义时直接给其赋值,
二是在构造函数中。而且在Java1.1以前,只能是在定义时给值。
三是在初如化代码块中{} 或者 static{}
下面这段代码演示了这一点:更加详细的探讨请参考关于final变量的初始化探讨

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

public class Bat {

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

    Bat(){
       i =100;
       list = newLinkedList();
    }

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

    publicstatic void main(String[] args) {
       Bat b = newBat();
      b.list.add(new Bat()); //引用不可变,但引用指向的内容是可以变的
       //b.i=25;   syntaxerror  i是不可变的
       //b.list=newArrayList(); 错误,对象引用是不可变的
      System.out.println("I=" + b.i + " List Type:" +b.list.getClass());
       b = newBat(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");


在看一个例子
//: FinalData.java
//The effect of final on fields
class Value {
    int i =1;
}

public class FinalData {
    // Can becompile-time constants
   final int i1 = 9;
   static final int I2 = 99;
   
    // Typicalpublic constant:
    publicstatic final int I3 = 39;
   
    // Cannot becompile-time constants:
   final int i4 = (int) (Math.random() *20);
   static final int i5 = (int)(Math.random() * 20);
   
    Value v1 =new Value();
   final Value v2 = newValue();
   static final Value v3 = newValue();
    // ! finalValue v4; // Pre-Java 1.1 Error:for no initializer
   
    //Arrays:
    final int[]a = { 1, 2, 3, 4, 5, 6 };

    public voidprint(String id) {
      System.out.println(id + ": " + "i4 = " + i4 + ", i5 = " +i5);
    }

    publicstatic void main(String[] args) {
       FinalDatafd1 = new FinalData();
       // !fd1.i1++; // Error: can't changevalue,因为i1是final的
       fd1.v2.i++;// Object isn'tconstant! 这个可以是因为类Value中的i是普通变量
       fd1.v1 = newValue(); // OK -- notfinal
       for (int i =0; i < fd1.a.length; i++)
          fd1.a[i]++;// Object isn't constant!

    //下面三个犯同样的错误Error:Can't changehandle
       // ! fd1.v2= new Value();
       // ! fd1.v3= new Value(); //
       // ! fd1.a =new int[3];
      fd1.print("fd1");
      System.out.println("Creating new FinalData");

       FinalDatafd2 = new FinalData();
      fd1.print("fd1");
      fd2.print("fd2");
  
阅读更多
个人分类: Java
上一篇Android Launcher抽屉类SlidingDrawer的使用!
下一篇Launcher-自定义实现类似android主界面的滑屏换屏控件
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭