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