日期:2011-03-22 16:17:00 来源:本站整理
数组和第一类对象[Java编程]
本文“数组和第一类对象[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
无论利用的数组属于什么范例,数组标识符实际都是指向真实对象的一个句柄.那些对象本身是在内存“堆”里成立的.堆对象既可“隐式”成立(即默许产生),亦可“显式”成立(即明确指定,用一个new表达式).堆对象的一部份(实际是我们能拜候的唯一字段或办法)是只读的length(长度)成员,它奉告我们那个数组对象里最多能包容多少元素.关于数组对象,“[]”语法是我们能采取的唯一另类拜候办法.
下面这个例子展示了对数组举行初始化的差别方法,以及若何将数组句柄分配给差别的数组对象.它也揭暴露对象数组和基本数据范例数组在利用办法上几近是完好一致的.唯一的差别在于对象数组包容的是句柄,而基本数据范例数组包容的是具体的数值(若在履行此程序时碰到艰难,请参考第3章的“赋值”小节):
//: ArraySize.java // Initialization & re-assignment of arrays package c08; class Weeble {} // A small mythical creature public class ArraySize { public static void main(String[] args) { // Arrays of objects: Weeble[] a; // Null handle Weeble[] b = new Weeble[5]; // Null handles Weeble[] c = new Weeble[4]; for(int i = 0; i < c.length; i++) c[i] = new Weeble(); Weeble[] d = { new Weeble(), new Weeble(), new Weeble() }; // Compile error: variable a not initialized: //!System.out.println("a.length=" + a.length); System.out.println("b.length = " + b.length); // The handles inside the array are // automatically initialized to null: for(int i = 0; i < b.length; i++) System.out.println("b[" + i + "]=" + b[i]); System.out.println("c.length = " + c.length); System.out.println("d.length = " + d.length); a = d; System.out.println("a.length = " + a.length); // Java 1.1 initialization syntax: a = new Weeble[] { new Weeble(), new Weeble() }; System.out.println("a.length = " + a.length); // Arrays of primitives: int[] e; // Null handle int[] f = new int[5]; int[] g = new int[4]; for(int i = 0; i < g.length; i++) g[i] = i*i; int[] h = { 11, 47, 93 }; // Compile error: variable e not initialized: //!System.out.println("e.length=" + e.length); System.out.println("f.length = " + f.length); // The primitives inside the array are // automatically initialized to zero: for(int i = 0; i < f.length; i++) System.out.println("f[" + i + "]=" + f[i]); System.out.println("g.length = " + g.length); System.out.println("h.length = " + h.length); e = h; System.out.println("e.length = " + e.length); // Java 1.1 initialization syntax: e = new int[] { 1, 2 }; System.out.println("e.length = " + e.length); } } ///:~
Here’s the output from the program:
b.length = 5 b[0]=null b[1]=null b[2]=null b[3]=null b[4]=null c.length = 4 d.length = 3 a.length = 3 a.length = 2 f.length = 5 f[0]=0 f[1]=0 f[2]=0 f[3]=0 f[4]=0 g.length = 4 h.length = 3 e.length = 3 e.length = 2
此中,数组a只是初始化成一个null句柄.此时,编译器会禁止我们对这个句柄作任何实际操作,除非已精确地初始化了它.数组b被初始化成指向由Weeble句柄构成的一个数组,但那个数组里实际并未安排任何Weeble对象.但是,我们仍旧可以查询那个数组的大小,因为b指向的是一个合理对象.这也为我们带来了一个难题:不可知道那个数组里实际包含了多少个元素,因为length只奉告我们可将多少元素置入那个数组.换言之,我们只知道数组对象的大小或容量,不知其实际包容了多少个元素.固然如此,由于数组对象在成立之初会自动初始化成null,所以可查抄它能否为null,判断一个特定的数组“空位”能否包容一个对象.近似地,由基本数据范例构成的数组会自动初始化成零(针对数值范例)、null(字符范例)大概false(布尔范例).
数组c显示出我们首先成立一个数组对象,再将Weeble对象赋给那个数组的全部“空位”.数组d揭暴露“调集初始化”语法,从而成立数组对象(用new号令明确举行,近似于数组c),然后用Weeble对象举行初始化,全部工作在一条语句里完成.
下面这个表达式:
a = d;
向我们展示了若何获得同一个数组对象衔接的句柄,然后将其赋给另一个数组对象,就象我们针对对象句柄的其他任何范例做的那样.目前,a和d都指向内存堆内一样的数组对象.
Java 1.1加入了一种新的数组初始化语法,可将其想象成“动态调集初始化”.由d采取的Java 1.0调集初始化办法例必须在定义d的同时举行.但假如采取Java 1.1的语法,却可以在任何地方成立和初始化一个数组对象.比方,假定hide()办法用于获得一个Weeble对象数组,那么调用它时传统的办法是:
hide(d);
但在Java 1.1中,亦可动态成立想作为参数传送的数组,以下所示:
hide(new Weeble[] {new Weeble(), new Weeble() });
这一新式语法使我们在某些场所下写代码更便利了.
上述例子的第二部份揭暴露这样一个问题:关于由基本数据范例构成的数组,它们的运作方法与对象数组极其类似,只是前者直接包涵了基本范例的数据值.
1. 基本数据范例调集
调集类只能包容对象句柄.但对一个数组,却既可令其直接包容基本范例的数据,亦可包容指向对象的句柄.操纵象Integer、Double之类的“封装器”类,可将基本数据范例的值置入一个调集里.但正如本章背面会在WordCount.java例子中讲到的那样,用于基本数据范例的封装器类只是在某些场所下才能施展作用.无论将基本范例的数据置入数组,还是将其封装进入位于调集的一个类内,都触及到履行效率的问题.明显,若能成立和拜候一个基本数据范例数组,那么比起拜候一个封装数据的调集,前者的效率会超过很多.
当然,假定预备一种基本数据范例,同时又想要调集的机动性(在需求的时刻可自动扩大,腾出更多的空间),就不宜利用数组,必须利用由封装的数据构成的一个调集.大家大概认为针对每种基本数据范例,都应有一种特别范例的Vector.但Java并未供应这一特点.某些情势的建模机制大概会在某一天帮忙Java更好地办理这个问题(注释①).
①:这儿是C++比Java做得好的一个地方,因为C++通过template关键字供应了对“参数化范例”的支持.
以上是“数组和第一类对象[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:java数组的返回
- ·下一篇文章:数组
- ·中查找“数组和第一类对象”更多相关内容
- ·中查找“数组和第一类对象”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论