Vector 的用法很簡單,這已在前面的例子中得到了證明。盡管我們大多數(shù)時候只需用addElement()插入對
象,用elementAt()一次提取一個對象,并用elements()獲得對序列的一個“枚舉”。但仍有其他一系列方
法是非常有用的。同我們對于Java 庫慣常的做法一樣,在這里并不使用或講述所有這些方法。但請務(wù)必閱讀
相應(yīng)的電子文檔,對它們的工作有一個大概的認識。
1. 崩潰Java
Java 標準集合里包含了toString()方法,所以它們能生成自己的String 表達方式,包括它們?nèi)菁{的對象。
例如在Vector 中,toString()會在Vector 的各個元素中步進和遍歷,并為每個元素調(diào)用toString()。假定
我們現(xiàn)在想打印出自己類的地址?雌饋硭坪鹾唵蔚匾胻his 即可(特別是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);
}
} ///:~
若只是簡單地創(chuàng)建一個CrashJava 對象,并將其打印出來,就會得到無窮無盡的一系列違例錯誤。然而,假
如將CrashJava 對象置入一個Vector,并象這里演示的那樣打印Vector,就不會出現(xiàn)什么錯誤提示,甚至連
一個違例都不會出現(xiàn)。此時Java 只是簡單地崩潰(但至少它沒有崩潰我的操作系統(tǒng))。這已在Java 1.1 中
測試通過。
此時發(fā)生的是字串的自動類型轉(zhuǎn)換。當我們使用下述語句時:
"CrashJava address: " + this
編譯器就在一個字串后面發(fā)現(xiàn)了一個“+”以及好象并非字串的其他東西,所以它會試圖將this 轉(zhuǎn)換成一個
字串。轉(zhuǎn)換時調(diào)用的是toString(),后者會產(chǎn)生一個遞歸調(diào)用。若在一個Vector 內(nèi)出現(xiàn)這種事情,看起來
堆棧就會溢出,同時違例控制機制根本沒有機會作出響應(yīng)。
若確實想在這種情況下打印出對象的地址,解決方案就是調(diào)用Object 的toString 方法。此時就不必加入
this,只需使用super.toString()。當然,采取這種做法也有一個前提:我們必須從Object 直接繼承,或
者沒有一個父類覆蓋了toString 方法。 本文出自:億恩科技【prubsntakaful.com】
服務(wù)器租用/服務(wù)器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|