某些時(shí)候,對(duì)于一個(gè)類來說,跟蹤其創(chuàng)建出來的實(shí)例個(gè)數(shù)會(huì)非常用有,其典型實(shí)現(xiàn)是通過讓它的構(gòu)造器遞增一個(gè)私有靜態(tài)域來完成的。在下面的程序中,Creature類展示了這種技巧,而Creator類對(duì)其進(jìn)行了操練,將打印出已經(jīng)創(chuàng)建的Creature實(shí)例的數(shù)量。那么,這個(gè)程序會(huì)打印出什么呢?
public class Creator {
public static void main(String[] args) {
for (int i = 0; i < 100; i++)
Creature creature = new Creature();
System.out.println(Creature.numCreated());
}
}
class Creature {
private static long numCreated = 0;
public Creature() {
numCreated++;
}
public static long numCreated() {
return numCreated;
}
}
這是一個(gè)捉弄人的問題。該程序看起來似乎應(yīng)該打印100,但是它沒有打印任何東西,因?yàn)樗揪筒荒芫幾g。如果你嘗試著去編譯它,你就會(huì)發(fā)現(xiàn)編譯器的診斷信息基本沒什么用處。下面就是javac打印的東西:
Creator.java:4: not a statement
Creature creature = new Creature();
^
Creator.java:4: ’;’ expected
Creature creature = new Creature();
^
一個(gè)本地變量聲明看起來像是一條語句,但是從技術(shù)上說,它不是;它應(yīng)該是一個(gè)本地變量聲明語句(local variable declaration statement)[JLS 14.4]。Java語言規(guī)范不允許一個(gè)本地變量聲明語句作為一條語句在for、while或do循環(huán)中重復(fù)執(zhí)行[JLS 14.12-14]。一個(gè)本地變量聲明作為一條語句只能直接出現(xiàn)在一個(gè)語句塊中。(一個(gè)語句塊是由一對(duì)花括號(hào)以及包含在這對(duì)花括展中的語句和聲明構(gòu)成的。)
有兩種方式可以訂正這個(gè)問題。最顯而易見的方式是將這個(gè)聲明至于一個(gè)語句塊中:
for (int i = 0; i < 100; i++) {
Creature creature = new Creature();
}
然而,請(qǐng)注意,該程序沒有使用本地變量creature。因此,將該聲明用一個(gè)無任何修飾的構(gòu)造器調(diào)用來替代將更具實(shí)際意義,這樣可以強(qiáng)調(diào)對(duì)新創(chuàng)建對(duì)象的引用正在被丟棄:
for (int i = 0; i < 100; i++)
new Creature();
public class Creator {
public static void main(String[] args) {
for (int i = 0; i < 100; i++)
Creature creature = new Creature();
System.out.println(Creature.numCreated());
}
}
class Creature {
private static long numCreated = 0;
public Creature() {
numCreated++;
}
public static long numCreated() {
return numCreated;
}
}
這是一個(gè)捉弄人的問題。該程序看起來似乎應(yīng)該打印100,但是它沒有打印任何東西,因?yàn)樗揪筒荒芫幾g。如果你嘗試著去編譯它,你就會(huì)發(fā)現(xiàn)編譯器的診斷信息基本沒什么用處。下面就是javac打印的東西:
Creator.java:4: not a statement
Creature creature = new Creature();
^
Creator.java:4: ’;’ expected
Creature creature = new Creature();
^
一個(gè)本地變量聲明看起來像是一條語句,但是從技術(shù)上說,它不是;它應(yīng)該是一個(gè)本地變量聲明語句(local variable declaration statement)[JLS 14.4]。Java語言規(guī)范不允許一個(gè)本地變量聲明語句作為一條語句在for、while或do循環(huán)中重復(fù)執(zhí)行[JLS 14.12-14]。一個(gè)本地變量聲明作為一條語句只能直接出現(xiàn)在一個(gè)語句塊中。(一個(gè)語句塊是由一對(duì)花括號(hào)以及包含在這對(duì)花括展中的語句和聲明構(gòu)成的。)
有兩種方式可以訂正這個(gè)問題。最顯而易見的方式是將這個(gè)聲明至于一個(gè)語句塊中:
for (int i = 0; i < 100; i++) {
Creature creature = new Creature();
}
然而,請(qǐng)注意,該程序沒有使用本地變量creature。因此,將該聲明用一個(gè)無任何修飾的構(gòu)造器調(diào)用來替代將更具實(shí)際意義,這樣可以強(qiáng)調(diào)對(duì)新創(chuàng)建對(duì)象的引用正在被丟棄:
for (int i = 0; i < 100; i++)
new Creature();