日期: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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论