返回介绍

8.4.1 Vector

发布于 2024-10-15 23:56:20 字数 1345 浏览 0 评论 0 收藏 0

Vector 的用法很简单,这已在前面的例子中得到了证明。尽管我们大多数时候只需用 addElement() 插入对象,用 elementAt() 一次提取一个对象,并用 elements() 获得对序列的一个“枚举”。但仍有其他一系列方法是非常有用的。同我们对于 Java 库惯常的做法一样,在这里并不使用或讲述所有这些方法。但请务必阅读相应的电子文档,对它们的工作有一个大概的认识。

1. 崩溃 Java

Java 标准集合里包含了 toString() 方法,所以它们能生成自己的 String 表达方式,包括它们容纳的对象。例如在 Vector 中,toString() 会在 Vector 的各个元素中步进和遍历,并为每个元素调用 toString()。假定我们现在想打印出自己类的地址。看起来似乎简单地引用 this 即可(特别是 C++程序员有这样做的倾向):

//: CrashJava.java
// One way to crash Java
import java.util.*;

public class CrashJava {
  public String toString() {
    return "CrashJava address: " + this + "\n";
  }
  public static void main(String[] args) {
    Vector v = new Vector();
    for(int i = 0; i < 10; i++)
      v.addElement(new CrashJava());
    System.out.println(v);
  }
} ///:~

若只是简单地创建一个 CrashJava 对象,并将其打印出来,就会得到无穷无尽的一系列违例错误。然而,假如将 CrashJava 对象置入一个 Vector,并象这里演示的那样打印 Vector,就不会出现什么错误提示,甚至连一个违例都不会出现。此时 Java 只是简单地崩溃(但至少它没有崩溃我的操作系统)。这已在 Java 1.1 中测试通过。

此时发生的是字串的自动类型转换。当我们使用下述语句时:

"CrashJava address: " + this

编译器就在一个字串后面发现了一个“+”以及好象并非字串的其他东西,所以它会试图将 this 转换成一个字串。转换时调用的是 toString(),后者会产生一个递归调用。若在一个 Vector 内出现这种事情,看起来堆栈就会溢出,同时违例控制机制根本没有机会作出响应。

若确实想在这种情况下打印出对象的地址,解决方案就是调用 Object 的 toString 方法。此时就不必加入 this,只需使用 super.toString()。当然,采取这种做法也有一个前提:我们必须从 Object 直接继承,或者没有一个父类覆盖了 toString 方法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文