当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:17:00  来源:本站整理

java中final的用法[Java编程]

赞助商链接



  本文“java中final的用法[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
很多程序计划语言都有自己的办法奉告编译器某个数据是“常数”.常数主要利用于下述两个方面:
(1) 编译期常数,它永久不会改变
(2) 在运行期初始化的一个值,我们不但愿它发生改变
关于编译期的常数,编译器(程序)可将常数值“封装”到需求的计算历程里.也就是说,计算可在编译期间提早履行,从而节俭运行时的一些开销.在Java中,这些情势的常数必须属于基本数据范例(Primitives),并且要用final关键字举行表达.在对这样的一个常数举行定义的时刻,必须给出一个值.
无论static还是final字段,都只能存储一个数据,并且不得改变.
若伴随对象句柄利用final,而不是基本数据范例,它的含义就略微让人有点儿含糊了.关于基本数据范例,final会将值变成一个常数;但关于对象句柄,final会将句柄变成一个常数.举行声明时,必须将句柄初始化到一个具体的对象.并且永久不能将句柄变成指向另一个对象.但是,对象本身是可以改正的.Java对此未供应任何手段,可将一个对象直接变成一个常数(但是,我们可自己编写一个类,使此中的对象具有“常数”效果).这一限制也实用于数组,它也属于对象.
下面是演示final字段用法的一个例子:
//: FinalData.java
// The effect of final on fields

class Value {
  int i = 1;
}

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

  public void print(String id) {
    System.out.println(
      id + ": " + "i4 = " + i4 + 
      ", i5 = " + i5);
  }
  public static void main(String[] args) {
    FinalData fd1 = new FinalData();
    //! fd1.i1++; // Error: can't change value
    fd1.v2.i++; // Object isn't constant!
    fd1.v1 = new Value(); // OK -- not final
    for(int i = 0; i < fd1.a.length; i++)
      fd1.a[i]++; // Object isn't constant!
    //! fd1.v2 = new Value(); // Error: Can't 
    //! fd1.v3 = new Value(); // change handle
    //! fd1.a = new int[3];

    fd1.print("fd1");
    System.out.println("Creating new FinalData");
    FinalData fd2 = new FinalData();
    fd1.print("fd1");
    fd2.print("fd2");
  }
} ///:~
由于i1和I2都是具有final属性的基本数据范例,并含有编译期的值,所以它们除了能作为编译期的常数利用外,在任何导入方法中也不会呈现任何差别.I3是我们体验此类常数定义时更典型的一种方法:public表示它们可在包外利用;Static夸大它们只有一个;而final表明它是一个常数.注意关于含有固定初始化值(即编译期常数)的fianl static基本数据范例,它们的名字按照法则要全部采取大写.也要注意i5在编译期间是未知的,所以它没有大写.
不能由于某样东西的属性是final,就认定它的值能在编译期间知道.i4和i5向大家证明了这一点.它们在运行期间利用随机生成的数字.例子的这一部份也向大家揭暴露将final值设为static和非static之间的差别.只有当值在运行期间初始化的前提下,这种差别才会揭暴露来.因为编译期间的值被编译器认为是相同的.这种差别可从输出后果中看出:
fd1: i4 = 15, i5 = 9
Creating new FinalData
fd1: i4 = 15, i5 = 9
fd2: i4 = 10, i5 = 9
注意关于fd1和fd2来说,i4的值是唯一的,但i5的值不会由于成立了另一个FinalData对象而发生改变.那是因为它的属性是static,并且在载入时初始化,而非每成立一个对象时初始化.
从v1到v4的变量向我们揭暴露final句柄的含义.正如大家在main()中看到的那样,并不能认为由于v2属于final,所以就不能再改变它的值.但是,我们确切不能再将v2绑定到一个新对象,因为它的属性是final.这就是final关于一个句柄的切当含义.我们会发现一样的含义亦实用于数组,后者只不过是另一种范例的句柄罢了.将句柄变成final看起来仿佛不如将基本数据范例变成final那么有效.

2. 空白final
Java 1.1答应我们成立“空白final”,它们属于一些特别的字段.固然被声明成final,但却未得到一个初始值.无论在哪类情形下,空白final都必须在实际利用前得到精确的初始化.并且编译器会主动保证这一规定得以贯彻.但是,关于final关键字的各种利用,空白final具有最大的机动性.举个例子来说,位于类内部的一个final字段目前对每个对象都可以有所差别,同时仍然保持其“不变”的本质.下面列出一个例子:
//: BlankFinal.java
// "Blank" final data members

class Poppet { }

class BlankFinal {
  final int i = 0; // Initialized final
  final int j; // Blank final
  final Poppet p; // Blank final handle
  // Blank finals MUST be initialized
  // in the constructor:
  BlankFinal() {
    j = 1; // Initialize blank final
    p = new Poppet();
  }
  BlankFinal(int x) {
    j = x; // Initialize blank final
    p = new Poppet();
  }
  public static void main(String[] args) {
    BlankFinal bf = new BlankFinal();
  }
} ///:~
目前强行要求我们对final举行赋值处理——要末在定义字段时利用一个表达 式,要末在每个构建器中.这样便可以确保final字段在利用前得到精确的初始化.

3. final自变量
Java 1.1答应我们将自变量设成final属性,办法是在自变量列表中对它们举行得当的声明.这意味着在一个办法的内部,我们不能改变自变量句柄指向的东西.以下所示:
//: FinalArguments.java
// Using "final" with method arguments

class Gizmo {
  public void spin() {}
}

public class FinalArguments {
  void with(final Gizmo g) {
    //! g = new Gizmo(); // Illegal -- g is final
    g.spin();
  }
  void without(Gizmo g) {
    g = new Gizmo(); // OK -- g not final
    g.spin();
  }
  // void f(final int i) { i++; } // Can't change
  // You can only read from a final primitive:
  int g(final int i) { return i + 1; }
  public static void main(String[] args) {
    FinalArguments bf = new FinalArguments();
    bf.without(null);
    bf.with(null);
  }
} ///:~
注意此时仍旧能为final自变量分配一个null(空)句柄,同时编译器不会捕捉它.这与我们对非final自变量采纳的操作是一样的.
办法f()和g()向我们展示出基本范例的自变量为final时会发生什么情形:我们只能读取自变量,不可改变它.
  以上是“java中final的用法[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .