暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
JAVA第8章 对象的容纳.pdf
337
30页
0次
2021-02-22
50墨值下载
8
对象的容纳
“如果一个程序只含有数量固定的对象,而且已知它们的存在时间,那么这
个程序可以说是相当简单的。
通常,我们的程序需要根据程序运行时才知道的一些标准创建新对象。除非
程序正式运行,否则我们根本不知道自己到底需要多少数量的对象,甚至不知道
它们的准确类型。为了满足常规编程的需要,我们要求能在任何时候、任何地点
创建任意数量的对象。所以不可依赖一个已命名的句柄来容纳自己的每一个对
象,就象下面这样:
MyObject myHandle;
因为根本不知道自己实际需要多少这样的东西。
为解决这个非常关键的问题,
Java
提供了容纳对象(或者对象的句柄)的多
种方式。其中内建的类型是数组,我们之前已讨论过它,本章准备加深大家对它
的认识。此外,
Java
的工具(实用程序)库提供了一些“集合类”(亦称作“容
器类”,但该术语已由
AWT
使用,所以这里仍采用“集合”这一称呼)。利用这
些集合类,我们可以容纳乃至操纵自己的对象。本章的剩余部分会就此进行详细
讨论。
8.1
数组
对数组的大多数必要的介绍已在第
4
章的最后一节进行。通过那里的学习,
家已知道自己该如何定义及初始化一个数组。对象的容纳是本章的重点,而数
组只是容纳对象的一种方式。但由于还有其他大量方法可容纳数组,所以是哪些
地方使数组显得如此特别呢?
两方的问将数与其集合型区开来率和型。
Java
来说,为保存和访问一系列对象实际是对象的句柄数组,最有效的方法莫过
于数组。数组实际代表一个简单的线性序列,它使得元素的访问速度非常快,
我们却要为这种速度付出代价:创建一个数组对象时,它的大小是固定的,而且
不可在那个数组对象的“存在时间”内发生改变。可创建特定大小的一个数组,
然后假如用光了存储空间,就再创建一个新数组,将所有句柄从旧数组移到新数
组。这属于“矢量”
Vector
类的行为,本章稍后还会详细讨论它。然而,由于
为这种大小的灵活性要付出较大的代价,所以我们认为矢量的效率并没有数组
高。
C++
的矢量类知道自己容纳的是什么类型的对象,但同
Java
的数组相比,
却有一个明显的缺点:
C++
矢量类的
operator[]
不能进行范围检查,所以很容易超
出边界(然而,它可以查询
vector
有多大,而且
at()
方法确实能进行范围检查)
Java
中,无论使用的是数组还是集合,都会进行范围检查——若超过边界
就会获得一个
RuntimeException
(运行期违例)错误。正如大家在第
9
章会学到
的那样,这类违例指出的是一个程序员错误,所以不需要在代码中检查它。在另
一方面,由于
C++
vector
不进行范围检查,所以访问速度较快——在
Java
中,
由于对数组和集合都要进行范围检查,所以对性能有一定的影响。
本章还要学习另外几种常见的集合类:
Vector
(矢量)
Stack
(堆栈)以及
Hashtable
(散列表)这些类都涉及对对象的处理——好象它们没有特定的类型。
换言之,它们将其当作
Object
类型处理(
Object
类型是
Java
中所有类的“根”
类)。从某个角度看,这种处理方法是非常合理的:我们仅需构建一个集合,然
后任何
Java
对象都可以进入那个集合(除基本数据类型外——可用
Java
的基本
类型封装类将其作为常数置入集合,或者将其封装到自己的类内,作为可以变化
的值使用)。这再一次反映了数组优于常规集合:创建一个数组时,可令其容纳
一种特定的类型。这意味着可进行编译期类型检查,预防自己设置了错误的类型,
或者错误指定了准备提取的类型。当然,在编译期或者运行期,
Java
会防止我们
将不当的消息发给一个对象。所以我们不必考虑自己的哪种做法更加危险,只要
编译器能及时地指出错误,同时在运行期间加快速度,目的也就达到了。此外,
用户很少会对一次违例事件感到非常惊讶的。
考虑到执行效率和类型检查,应尽可能地采用数组。然而,当我们试图解决
一个更常规的问题时,数组的局限也可能显得非常明显。在研究过数组以后,
章剩余的部分将把重点放到
Java
提供的集合类身上。
8.1.1
数组和第一类对象
无论使用的数组属于什么类型,数组标识符实际都是指向真实对象的一个句
柄。那些对象本身是在内存“堆”里创建的。堆对象既可“隐式”创建(即默认
产生),亦可“显式”创建(即明确指定,用一个
new
表达式)堆对象的一部
(实际是我们能访问的唯一字段或方法)是只读的
length
(长度)成员,它告
诉我们那个数组对象里最多能容纳多少元素。对于数组对象,
[]”
语法是我们能
采用的唯一另类访问方法。
下面这个例子展示了对数组进行初始化的不同方式,以及如何将数组句柄分
配给不同的数组对象。它也揭示出对象数组和基本数据类型数组在使用方法上几
乎是完全一致的。唯一的差别在于对象数组容纳的是句柄,而基本数据类型数组
容纳的是具体的数值(若在执行此程序时遇到困难,请参考第
3
章的“赋值”
of 30
50墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜