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

<b>java的数组初始化</b>[Java编程]

赞助商链接



  本文“<b>java的数组初始化</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在C中初始化数组极易出错,并且相当麻烦.C++通过“调集初始化”使其更安全(注释⑥).Java则没有象C++那样的“调集”概念,因为Java中的全部东西都是对象.但它确切有自己的数组,通过数组初始化来供应支持.
数组代表一系列对象大概基本数据范例,全部相同的范例都封装到一同——采取一个统一的标识符名称.数组的定义和利用是通过方括号索引运算符举行的([]).为定义一个数组,只需在范例名后简单地跟随一对空方括号便可:
int[] al;
也可以将方括号置于标识符背面,得到完好一致的后果:
int al[];
这种格局与C和C++程序员习惯的格局是一致的.但是,最“通畅”的大概还是前一种语法,因为它指出范例是“一个int数组”.本书将相沿那种格局.
编译器不答应我们奉告它一个数组有多大.这样便使我们回到了“句柄”的问题上.此时,我们拥有的一切就是指向数组的一个句柄,并且还没有给数组分配任何空间.为了给数构成立呼应的存储空间,必须编写一个初始化表达式.关于数组,初始化工作可在代码的任何地方呈现,但也可以利用一种特别的初始化表达式,它必须在数构成立的地方呈现.这种特别的初始化是一系列由花括号封闭起来的值.存储空间的分配(等价于利用new)将由编译器在这种情形下举行.比方:
int[] a1 = { 1, 2, 3, 4, 5 };
那么为什么还要定义一个没有数组的数组句柄呢?
int[] a2;
事实上在Java中,可将一个数组分配给另一个,所以能利用下述语句:
a2 = a1;
我们真正预备做的是复制一个句柄,就象下面演示的那样:

//: Arrays.java
// Arrays of primitives.

public class Arrays {
  public static void main(String[] args) {
    int[] a1 = { 1, 2, 3, 4, 5 };
    int[] a2;
    a2 = a1;
    for(int i = 0; i < a2.length; i++)
      a2[i]++;
    for(int i = 0; i < a1.length; i++)
      prt("a1[" + i + "] = " + a1[i]);
  }
  static void prt(String s) {
    System.out.println(s);
  }
} ///:~

大家看到a1得到了一个初始值,而a2没有;a2将在今后赋值——这种情形下是赋给另一个数组.
这里也呈现了一些新东西:全部数组都有一个本质成员(无论它们是对象数组还是基本范例数组),可对其举行查询——但不是改变,从而获知数组内包含了多少个元素.这个成员就是length.与C和C++近似,由于Java数组从元素0开始计数,所以能索引的最大元素编号是“length-1”.如超越边界,C和C++会“默默”地承受,并答应我们胡乱利用自己的内存,这恰是很多程序错误的本源.但是,Java可保存我们这受这一问题的侵害,办法是一旦超越边界,就生成一个运行期错误(即一个“违例”,这是第9章的主题).当然,由于需求查抄每个数组的拜候,所以会损耗一定的时间和多余的代码量,并且没有办法把它关闭.这意味着数组拜候大概成为程序效率低下的重要缘由——假如它们在关键的场所举行.但考虑到因特网拜候的安全,以及程序员的编程效率,Java计划人员还是应当把它看做是值得的.
程序编写期间,假如不知道在自己的数组里需求多少元素,那么又该怎么办呢?此时,只需简单地用new在数组里成立元素.在这里,即便预备成立的是一个基本数据范例的数组,new也能正常地工作(new不会成立非数组的基本范例):

//: ArrayNew.java
// Creating arrays with new.
import java.util.*;

public class ArrayNew {
  static Random rand = new Random();
  static int pRand(int mod) {
    return Math.abs(rand.nextInt()) % mod + 1;
  }
  public static void main(String[] args) {
    int[] a;
    a = new int[pRand(20)];
    prt("length of a = " + a.length);
    for(int i = 0; i < a.length; i++)
      prt("a[" + i + "] = " + a[i]);
  }
  static void prt(String s) {
    System.out.println(s);
  }
} ///:~

由于数组的大小是随机决意的(利用早先定义的pRand()办法),所以十清楚显,数组的成立实际是在运行期间举行的.除此以外,从这个程序的输出中,大家可看到基本数据范例的数组元素会自动初始化成“空”值(关于数值,空值就是零;关于char,它是null;而关于boolean,它倒是false).
当然,数组大概已在相同的语句中定义和初始化了,以下所示:
int[] a = new int[pRand(20)];
若操作的是一个非基本范例对象的数组,那么无论若何都要利用new.在这里,我们会再一次碰到句柄问题,因为我们成立的是一个句柄数组.请大家察看封装器范例Integer,它是一个类,而非基本数据范例:

//: ArrayClassObj.java
// Creating an array of non-primitive objects.
import java.util.*;

public class ArrayClassObj {
  static Random rand = new Random();
  static int pRand(int mod) {
    return Math.abs(rand.nextInt()) % mod + 1;
  }
  public static void main(String[] args) {
    Integer[] a = new Integer[pRand(20)];
    prt("length of a = " + a.length);
    for(int i = 0; i < a.length; i++) {
      a[i] = new Integer(pRand(500));
      prt("a[" + i + "] = " + a[i]);
    }
  }
  static void prt(String s) {
    System.out.println(s);
  }
} ///:~

在这儿,乃至在new调用后才开始成立数组:
Integer[] a = new Integer[pRand(20)];
它只是一个句柄数组,并且除非通过成立一个新的Integer对象,从而初始化了对象句柄,不然初始化进程不会完毕:
a[i] = new Integer(pRand(500));
但假如忘掉成立对象,就会在运行期试图读取空数组位置时得到一个“违例”错误.
下面让我们看看打印语句中String对象的构成情形.大家可看到指向Integer对象的句柄会自动转换,从而产生一个String,它代表着位于对象内部的值.
亦可用花括号封闭列表来初始化对象数组.可采取两种情势,第一种是Java 1.0答应的唯一情势.第二种(等价)情势自Java 1.1才开始供应支持:

//: ArrayInit.java
// Array initialization

public class ArrayInit {
  public static void main(String[] args) {
    Integer[] a = {
      new Integer(1),
      new Integer(2),
      new Integer(3),
    };

    // Java 1.1 only:
    Integer[] b = new Integer[] {
      new Integer(1),
      new Integer(2),
      new Integer(3),
    };
  }
} ///:~

这种做法大大都时刻都很有效,但限制也是最大的,因为数组的大小是在编译期间决意的.初始化列表的最后一个逗号是可选的(这一特点使长列表的保护变得越发简单).
数组初始化的第二种情势(Java 1.1开始支持)供应了一种更简便的语法,可成立和调用办法,得到与C的“变量参数列表”(C普通把它简称为“变参表”)一致的效果.这些效果包含未知的参数(自变量)数目以及未知的范例(假如这样挑选的话).由于全部类终究都是从通用的根类Object中担当的,所以能成立一个办法,令其获得一个Object数组,并象下面这样调用它:

//: VarArgs.java
// Using the Java 1.1 array syntax to create
// variable argument lists

class A { int i; }

public class VarArgs {
  static void f(Object[] x) {
    for(int i = 0; i < x.length; i++)
      System.out.println(x[i]);
  }
  public static void main(String[] args) {
    f(new Object[] { 
        new Integer(47), new VarArgs(), 
        new Float(3.14), new Double(11.11) });
    f(new Object[] {"one", "two", "three" });
    f(new Object[] {new A(), new A(), new A()});
  }
} ///:~

此时,我们对这些未知的对象并不能采纳太多的操作,并且这个程序操纵自动String转换对每个Object做一些有效的事情.在第11章(运行期范例标识或RTTI),大家还会学习若何调查这类对象的精确范例,使自己能对它们做一些风趣的事情.
  以上是“<b>java的数组初始化</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

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

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