动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.初探Java类加载机制.
.Java编程:配置Tomcat5数据源心得.
.幸福的联姻:Java 和 Python.
.Java 平台透析.
.Java技巧:用Java保存位图文件.
.ShortPath 属性.
.Java调试教程--Jikes概述.
.Java连接数据库实例.
.jdon版jive在resin-2.1.4和sqlse.
.在Java中定义数据类型.
.从 if else 到设.
.Java 2 引用类使用指南(1).
.JavaScript如何与Applet通讯.
.一个相当经典的RMI实例源代码及详.
.川石用JAVA写的留言板原代码.
.Java做一个最简单的Socket通话程.
.破除java神话之二:参数是传址的.
.Java 5.0 多线程编程实.
.如何将JAVA生成可执行文件?.
.关于J2ME程序员新手开发入门的几.

final数据

发表日期:2008-1-5 |



  许多程序设计语言都有自己的办法告诉编译器某个数据是“常数”。常数主要应用于下述两个方面:
  
  (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时会发生什么情况:我们只能读取自变量,不可改变它。
上一篇:何谓“上溯造型”? 人气:400
下一篇:必须执行清除 人气:284
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-6 Movie34电影搜索引擎 v3.0
2008-9-6 wap2.0仿帝国建站喜用 v2.0
2008-9-6 免费人才招聘网 宽屏版 v3.01
2008-9-6 喜喔喔视频采集程序 v1.0 beta
2008-9-6 ASP客户管理系统
2008-9-6 主流驿站中秋祝福程序
2008-9-6 php实现msn协议的类
2008-9-5 Coppermine Photo Gallery v1.4.
2008-9-5 清松网络日记本 v2.4
2008-9-7 iBlacklist通话黑名单汉化破解补
2008-9-7 EndlessWalls无尽壁纸 v1.0.4破解
2008-9-7 Dynolicious车载测量仪v1.1破解版
2008-9-7 iVoodoo巫毒娃娃1.0.1破解版
2008-9-7 iWallpape精品墙纸1.2破解版
2008-9-7 iChillout自然音效工具1.1破解版
2008-9-7 Todo计划提醒1.2破解版
2008-9-7 allRadio电台集合1.01破解版
2008-9-7 My Money个人理财1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵