关于Java中的final

转载 2012年03月31日 13:41:47
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面试题---final 修饰符

Java final 修饰符知识点总结final从字面上理解含义为“最后的,最终的”。在Java中也同样表示出此种含义。final可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类...
  • u014726937
  • u014726937
  • 2016年07月30日 15:04
  • 843

深入理解final关键字

在Java中,final关键字可以用来修饰数据、方法、参数、类,下面我们来了解final的关键字的用法。基本用法final 数据对于基本类型,final使数值恒定不变;而对用对象引用,final使引用...
  • IO_Field
  • IO_Field
  • 2016年10月16日 15:12
  • 2137

Java中final用法与详解

Java中final用法与详解
  • u014276600
  • u014276600
  • 2016年08月07日 19:02
  • 946

Java中的final用法及含义

final关键字的使用方法 修饰变量:final成员变量表示常量,只能被赋值一次,赋值后值不再改变。 修饰方法:final方法不能被子类方法覆盖,但可以被继承。 修饰类:final类不能被继承,没有子...
  • u014686462
  • u014686462
  • 2015年10月28日 15:58
  • 456

在Java中,final修饰的类有什么特点

关于Java中的final(2010-09-09 14:19:48)转载▼标签: javafinal 分类: Java知识学习 Java中的final共有三种用法: final成员变量 当你在...
  • u010601729
  • u010601729
  • 2014年08月06日 20:10
  • 794

final关键词在多线程环境中的使用

原文:http://www.javamex.com/tutorials/synchronization_final.shtml  Contents 为什么final在多线程中是必要的 final对...
  • xiaoxiaoxuanao
  • xiaoxiaoxuanao
  • 2016年09月18日 13:57
  • 2698

Java中常见的final类

final为Java中常用的关键字,被final修饰的类不可被继承下面列举几个Java包中的final类():1.java.lang包(列举所有final类)包装类:Boolean,Character...
  • dgeek
  • dgeek
  • 2016年12月01日 19:00
  • 2671

java关键字-final语义

转载:http://www.infoq.com/cn/articles/java-memory-model-6/ 对java关键字final的解析,以前都没关注过final竟然这些东西。 与...
  • xiaoxufox
  • xiaoxufox
  • 2016年05月24日 17:09
  • 840

java Final关键字语义剖析

常用用法 java中final关键字大家经常使用。final可以用于声明字段、方法和类。final声明字段时,若为基本类型,表示该变量值初始化后不再改变;若为引用类型,则表示引用不可变,但引用所指向...
  • quanzhongzhao
  • quanzhongzhao
  • 2015年05月13日 16:19
  • 934

关于Java Final 修饰的局部变量,多线程可以访问

局部内部类的对象可以访问同一个方法中被定义为final的局部变量。定义为final后,编译程序的实现方法:将所有的局部内部类对象要访问的final型局部变量,都拷贝成为该内部类对象中的一个数据成员。这...
  • gbxvip
  • gbxvip
  • 2016年07月05日 17:13
  • 635
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Java中的final
举报原因:
原因补充:

(最多只允许输入30个字)